Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z funkcją
Mutakoss
post 25.12.2010, 14:44:21
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


Hi.

Mam oto taką funkcję:
  1. delimiter ;;
  2. CREATE FUNCTION test () returns varchar(20)
  3. begin
  4. CREATE TABLE SYLABY(id int PRIMARY KEY AUTO_INCREMENT, nazwa char(10));
  5. INSERT INTO SYLABY (nazwa) VALUES ('da');
  6. INSERT INTO SYLABY (nazwa) VALUES ('wa');
  7. INSERT INTO SYLABY (nazwa) VALUES ('za');
  8. INSERT INTO SYLABY (nazwa) VALUES ('po');
  9. INSERT INTO SYLABY (nazwa) VALUES ('wo');
  10. INSERT INTO SYLABY (nazwa) VALUES ('tu');
  11. INSERT INTO SYLABY (nazwa) VALUES ('bu');
  12. INSERT INTO SYLABY (nazwa) VALUES ('lo');
  13. INSERT INTO SYLABY (nazwa) VALUES ('ki');
  14. INSERT INTO SYLABY (nazwa) VALUES ('mi');
  15. INSERT INTO SYLABY (nazwa) VALUES ('zu');
  16. INSERT INTO SYLABY (nazwa) VALUES ('ne');
  17. INSERT INTO SYLABY (nazwa) VALUES ('me');
  18. INSERT INTO SYLABY (nazwa) VALUES ('cy');
  19. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm1;
  20. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm2;
  21. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm3;
  22. SELECT concat(@zm1, @zm2, @zm3, 'ski');
  23.  
  24. RETURN 0;
  25. END;
  26. ;;
  27. DELIMITER ;
  28.  


Funkcja ma wypelniac tabele losowymi danymi (oczywiscie pozniej będzie pętla While co spowoduje wypelnienie calej tabeli a nie tylko jednego wiersza)
Anyway problem w tym, że funkcja nie dziala.

Dostaje błąd: Not allowed to return a result set from a function.

W googlach są odpowiedzi, ale średnio je rozumiem. Mógłby ktoś coś doradzić?

pozdrawiam
Go to the top of the page
+Quote Post
wookieb
post 25.12.2010, 17:52:14
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




1) Dlaczego do wypełnienia tabeli danymi potrzebna jest funkcja?
2) Skoro zdefiniowałeś, że zwrócona wartość ma być typu
  1. varchar(20)
to dlaczego zwracasz numer?


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 25.12.2010, 23:15:38
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


1)Funkcja potrzebna mi bo robie projekt na zaliczenie semestru a nasz wykladowca nie kazal wypelniac tego konkretnymi danymi i zalecil wlasnie taki sposob. A jesli chodzi o to czemu nie robie tego w procedurze - to korzystam z funkcji bo wydaje mi się prostsza do napisania.

2) Historia dluga dlaczego tak jest, ogolnie nie chce zeby cos sie wyswietlalo na koncu tej funkcji. I jak bylem na cwiczeniach to z mala pomoca wykladowcy udalo mi się to zrobic - niestety nie skopiowalem calosci.

Anyway - wpisujac nawet 'Hello world' zamiast zera to i tak wystepuje ten sam błąd. Niestety :/

Jakby co to skrypt mozna uzyc na obojetnie jakiej bazie danych, bo nie wymaga jakichs specjalnych tabel/

Ten post edytował Mutakoss 25.12.2010, 23:16:43
Go to the top of the page
+Quote Post
wookieb
post 25.12.2010, 23:22:45
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Mutakoss @ 25.12.2010, 23:15:38 ) *
zalecil wlasnie taki sposob.

Kyrie eleison! Albo źle zrozumiałeś wykładowcę albo on nie wie co mówi

  1. delimiter ;;
  2.  
  3. CREATE FUNCTION test () returns char
  4. begin
  5. CREATE TABLE SYLABY(id int PRIMARY KEY AUTO_INCREMENT, nazwa char(10));
  6. INSERT INTO SYLABY (nazwa) VALUES ('da');
  7. INSERT INTO SYLABY (nazwa) VALUES ('wa');
  8. INSERT INTO SYLABY (nazwa) VALUES ('za');
  9. INSERT INTO SYLABY (nazwa) VALUES ('po');
  10. INSERT INTO SYLABY (nazwa) VALUES ('wo');
  11. INSERT INTO SYLABY (nazwa) VALUES ('tu');
  12. INSERT INTO SYLABY (nazwa) VALUES ('bu');
  13. INSERT INTO SYLABY (nazwa) VALUES ('lo');
  14. INSERT INTO SYLABY (nazwa) VALUES ('ki');
  15. INSERT INTO SYLABY (nazwa) VALUES ('mi');
  16. INSERT INTO SYLABY (nazwa) VALUES ('zu');
  17. INSERT INTO SYLABY (nazwa) VALUES ('ne');
  18. INSERT INTO SYLABY (nazwa) VALUES ('me');
  19. INSERT INTO SYLABY (nazwa) VALUES ('cy');
  20. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm1;
  21. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm2;
  22. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm3;
  23. SELECT concat(@zm1, @zm2, @zm3, 'ski');
  24.  
  25. RETURN 'Hello world';
  26. END;
  27. delimiter ;
  28.  

Albo...
  1. delimiter ;;
  2.  
  3. CREATE FUNCTION test () returns integer
  4. begin
  5. CREATE TABLE SYLABY(id int PRIMARY KEY AUTO_INCREMENT, nazwa char(10));
  6. INSERT INTO SYLABY (nazwa) VALUES ('da');
  7. INSERT INTO SYLABY (nazwa) VALUES ('wa');
  8. INSERT INTO SYLABY (nazwa) VALUES ('za');
  9. INSERT INTO SYLABY (nazwa) VALUES ('po');
  10. INSERT INTO SYLABY (nazwa) VALUES ('wo');
  11. INSERT INTO SYLABY (nazwa) VALUES ('tu');
  12. INSERT INTO SYLABY (nazwa) VALUES ('bu');
  13. INSERT INTO SYLABY (nazwa) VALUES ('lo');
  14. INSERT INTO SYLABY (nazwa) VALUES ('ki');
  15. INSERT INTO SYLABY (nazwa) VALUES ('mi');
  16. INSERT INTO SYLABY (nazwa) VALUES ('zu');
  17. INSERT INTO SYLABY (nazwa) VALUES ('ne');
  18. INSERT INTO SYLABY (nazwa) VALUES ('me');
  19. INSERT INTO SYLABY (nazwa) VALUES ('cy');
  20. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm1;
  21. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm2;
  22. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm3;
  23. SELECT concat(@zm1, @zm2, @zm3, 'ski');
  24.  
  25. RETURN 0;
  26. END;
  27. delimiter ;
  28.  


Ten post edytował wookieb 25.12.2010, 23:23:40


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 25.12.2010, 23:57:25
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


[quote name='wookieb' date='25.12.2010, 23:22:45 ' post='820415']
Kyrie eleison! Albo źle zrozumiałeś wykładowcę albo on nie wie co mówi


Moglbys wyjasnic dlaczego?smile.gif
Go to the top of the page
+Quote Post
wookieb
post 26.12.2010, 00:01:26
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Bo tworzysz tabelę (za każdym wywołaniem funkcji), która pełni funkcję tablicy do wylosowania sylab i wypełniasz je danymi (też za każdym razem) tylko po to żeby wylosować 3 wartości :/ (oczywiście pomijam fakt, że można to zrobić jednym zapytaniem i tak też powinno być)
A teraz finał. Losujesz ale w żaden sposób jej nie zwracasz. Bezsens na każdym kroku.


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 26.12.2010, 00:29:46
Post #7





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


Ah o to chodzi.

Oczywiście to jest tylko zrobione żeby caly ten system działał. W finalnej wersji nie będzie tworzona tam żadna tabela, wynik będzie dopisywany do zmiennej a zmienna wpisywana do tabeli, wszystko w pętli while żeby wypelnic odpowiednią ilość wierszy. Przynajmniej mam zamiar tak to przerobic. Moze da się to zrobić jednym zapytaniem, niestety nie znam takiego sposobu i korzystam z tego co w miarę potrafię zrobić.



bump niestety, nie ukrywam że wcześniej nie sprawidzlem bo nie mialem zbytnio czasu, wklejam oba kody które podałeś i dalej to niestety nie działa. Ciągle mam ten sam błąd.

Go to the top of the page
+Quote Post
wookieb
post 26.12.2010, 09:20:56
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wersja mysql? Moja 5.1 i oba działają. Sprawdź czy na pewno dobrze skopiowałeś (plaintext bo skopiujesz też głupie cyferki)


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 26.12.2010, 11:55:05
Post #9





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


5.1.51 for win32, moge zawsze jak cos sprawdzic na linuxie.

I tak, kopiuje z plaintext.

Jeszcze jedno pytanie - bo mowisz, że Ci dziala, Ty to wklejasz na zasadzie kopiuj wklej czy robisz z tego skrypt .sh w linuxie? Bo jak ja to wkleja to on oczekuje znaków delimitera, więc trochę to modyfikuje i po
  1. END;
wklejam
  1. ;;


Ten post edytował Mutakoss 26.12.2010, 11:55:32
Go to the top of the page
+Quote Post
wookieb
post 26.12.2010, 13:32:56
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wklejam po prostu w phpmyadminie nawet. W konsoli też działa.


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 26.12.2010, 13:43:47
Post #11





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


hm to nie dziala ;x przeinstaluje mysql i zobacze
Go to the top of the page
+Quote Post
wookieb
post 26.12.2010, 22:01:16
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Opisz krok po kroku co robisz i jakie masz błędy.


--------------------
Go to the top of the page
+Quote Post
Mutakoss
post 26.12.2010, 23:16:44
Post #13





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 25.12.2010

Ostrzeżenie: (0%)
-----


Po reinstalce serwera mysql mam wersje 5.5.8.

Co robiłem ? wklejałem to co mi dales i nie wysyłał tego do serwera bo nie było ";;" po wpisaniu tego delimitera był ten błąd. Zrobiłem małą modyfikacje i - choć dalej nie działa - mam inny błąd.
  1. delimiter ;;
  2.  
  3. CREATE FUNCTION test () returns varchar(20)
  4.  
  5. begin
  6. CREATE TABLE SYLABY(id int PRIMARY KEY AUTO_INCREMENT, nazwa char(10));
  7. INSERT INTO SYLABY (nazwa) VALUES ('da');
  8. INSERT INTO SYLABY (nazwa) VALUES ('wa');
  9. INSERT INTO SYLABY (nazwa) VALUES ('za');
  10. INSERT INTO SYLABY (nazwa) VALUES ('po');
  11. INSERT INTO SYLABY (nazwa) VALUES ('wo');
  12. INSERT INTO SYLABY (nazwa) VALUES ('tu');
  13. INSERT INTO SYLABY (nazwa) VALUES ('bu');
  14. INSERT INTO SYLABY (nazwa) VALUES ('lo');
  15. INSERT INTO SYLABY (nazwa) VALUES ('ki');
  16. INSERT INTO SYLABY (nazwa) VALUES ('mi');
  17. INSERT INTO SYLABY (nazwa) VALUES ('zu');
  18. INSERT INTO SYLABY (nazwa) VALUES ('ne');
  19. INSERT INTO SYLABY (nazwa) VALUES ('me');
  20. INSERT INTO SYLABY (nazwa) VALUES ('cy');
  21. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm1;
  22. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm2;
  23. SELECT nazwa FROM SYLABY ORDER BY RAND() LIMIT 1 INTO @zm3;
  24. SELECT concat(@zm1, @zm2, @zm3, 'ski') INTO @nazwisko;
  25.  
  26. RETURN @nazwisko;
  27. END;
  28. ;;
  29. delimiter ;


a błąd to
  1. explicit OR implicit commit IS NOT allowed IN stored FUNCTION OR TRIGGER
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 16:52