Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z procedurą
Forum PHP.pl > Forum > Bazy danych > MySQL
splatch
Witam serdecznie mam taką procedurę:
  1. CREATE PROCEDURE delete_values(IN ile INT)
  2. BEGIN DECLARE adone INT DEFAULT 0;
  3. DECLARE a INT DEFAULT 0;
  4. DECLARE b INT DEFAULT 0;
  5. DECLARE cnt INT DEFAULT 0;
  6. DECLARE laste INT DEFAULT 0;
  7.  
  8. DECLARE cur1 CURSOR FOR SELECT v.user_parameter_value_id, v.user_parameter_values_id
  9. FROM user_parameter_value
  10. AS v
  11. INNER JOIN (
  12. SELECT user_parameter_values_id, COUNT(*) AS cnt
  13. FROM `user_parameter_value`
  14. GROUP BY user_parameter_values_id
  15. ) AS costam ON costam.cnt > 3 AND v.user_parameter_values_id = costam.user_parameter_values_id;
  16.  
  17. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET adone = 1;
  18.  
  19. OPEN cur1;
  20.  
  21.  
  22. REPEAT
  23. FETCH cur1
  24. INTO a,
  25. b;
  26. IF NOT adone THEN
  27. IF b <> laste THEN
  28. SET cnt = 0;
  29. SET laste = b;
  30. ELSE
  31. IF cnt > ile THEN
  32. DELETE
  33. FROM user_parameter_value
  34. WHERE user_parameter_value_id = a;
  35. END IF;
  36. END IF;
  37. SET cnt = cnt+1;
  38. END IF;
  39. UNTIL adone END REPEAT;
  40.  
  41. CLOSE cur1;
  42. END

Nie wiem czemu, ale nie mogę stworzyć procedury. Na mysql 5.0.19 ten kod powoduje błąd:
Kod
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear 'INT DEFAULT 0' at line 3

Dlaczego? Declare jest w porządku, tak jak nakazuje dokumentacja..
Vogel
eee

moze raczej zrob to tak:

  1. delimiter |
  2. CREATE PROCEDURE delete_values(IN ile INT)
  3. BEGIN DECLARE adone INT DEFAULT 0;
  4. DECLARE a INT DEFAULT 0;
  5. DECLARE b INT DEFAULT 0;
  6. DECLARE cnt INT DEFAULT 0;
  7. DECLARE laste INT DEFAULT 0;
  8.  
  9. DECLARE cur1 CURSOR FOR SELECT v.user_parameter_value_id, v.user_parameter_values_id
  10. FROM user_parameter_value
  11. AS v
  12. INNER JOIN (
  13. SELECT user_parameter_values_id, COUNT(*) AS cnt
  14. FROM `user_parameter_value`
  15. GROUP BY user_parameter_values_id
  16. ) AS costam ON costam.cnt > 3 AND v.user_parameter_values_id = costam.user_parameter_values_id;
  17.  
  18. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET adone = 1;
  19.  
  20. OPEN cur1;
  21.  
  22.  
  23. REPEAT
  24. FETCH cur1
  25. INTO a,
  26. b;
  27. IF NOT adone THEN
  28. IF b <> laste THEN
  29. SET cnt = 0;
  30. SET laste = b;
  31. ELSE
  32. IF cnt > ile THEN
  33. DELETE
  34. FROM user_parameter_value
  35. WHERE user_parameter_value_id = a;
  36. END IF;
  37. END IF;
  38. SET cnt = cnt+1;
  39. END IF;
  40. UNTIL adone END REPEAT;
  41.  
  42. CLOSE cur1;
  43. END|
  44. delimiter ;
splatch
Też nie idzie..
Kod
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter |
CREATE PROCEDURE delete_values(IN ile INT)
BEGIN DECLARE adone INT' at line 1
Vogel
ej. nie gadaj ze nie idzie. u mnie wszystko pieknie dziala.

odpalasz to z konsoli mysql? bo w phpMyAdmin mozesz jak na razie zapomniec o procedurach skladowanych...
splatch
hmm rzeczywiście poszło, wcześniej sprawdzałem na konsoli i na php my adminie - błąd był ten sam i rano nie sprawdziłem z konsoli. Przepraszam za problem smile.gif
Vogel
nou problemo. na serwerze z mySQL 5.0 mam dostep do konsoli wiec z czystej ciekawosci sprawdzilem czy da sie wrzucic procedre za pomoca phpowego mysql_query() - da sie. wg. skladni z pierwszego Twojego posta.

widocznie tylko phpMyAdmin ma z tym klopot. no nic. poczekamy na apgrejd ;D
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-2024 Invision Power Services, Inc.