Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z funkcją
Forum PHP.pl > Forum > Bazy danych > MySQL
Mutakoss
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
wookieb
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?
Mutakoss
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/
wookieb
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.  
Mutakoss
[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
wookieb
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.
Mutakoss
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.

wookieb
Wersja mysql? Moja 5.1 i oba działają. Sprawdź czy na pewno dobrze skopiowałeś (plaintext bo skopiujesz też głupie cyferki)
Mutakoss
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. ;;
wookieb
Wklejam po prostu w phpmyadminie nawet. W konsoli też działa.
Mutakoss
hm to nie dziala ;x przeinstaluje mysql i zobacze
wookieb
Opisz krok po kroku co robisz i jakie masz błędy.
Mutakoss
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.