Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kod procedury składowanej, błąd przy zapytaniu
Forum PHP.pl > Forum > Bazy danych
Pite(R)
Witam.

Mam pewną procedurę, którą muszę wstawić z pierwotnej bazy danych do nowej, przystosowanej do obsługi wielu języków, ale nie o to chodzi. Gdy próbuję ją wstawić zapytaniem CREATE PROCEDURE (bezpośrednio przeklejam kod procedury do innej bazy), otrzymuję błąd (w phpMyAdmin):

Kod
Zapytanie SQL:

CREATE DEFINER =  `cit1`@`localhost` PROCEDURE  `item_count` ( IN p_type_id SMALLINT UNSIGNED ) BEGIN declare v_done TINYINT UNSIGNED DEFAULT 0;


MySQL zwrócił komunikat:

#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 '' at line 5

Oto kod tejże procedury (nie jest mojego autorstwa):

  1. CREATE DEFINER=`cit1`@`localhost` PROCEDURE `item_count`(
  2. IN p_type_id smallint UNSIGNED)
  3. begin
  4.  
  5. declare v_done tinyint UNSIGNED DEFAULT 0;
  6. declare v_depth smallint UNSIGNED DEFAULT 0;
  7.  
  8. CREATE TEMPORARY TABLE hier(
  9. parent_type_id smallint UNSIGNED,
  10. id smallint UNSIGNED,
  11. depth smallint UNSIGNED DEFAULT 0
  12. )engine = memory;
  13.  
  14. INSERT INTO hier SELECT parent_type_id, id, v_depth FROM item_types_view WHERE id = p_type_id;
  15.  
  16.  
  17. CREATE TEMPORARY TABLE tmp engine=memory SELECT * FROM hier;
  18.  
  19. while NOT v_done do
  20.  
  21. IF EXISTS( SELECT 1 FROM item_types_view p INNER JOIN hier ON p.parent_type_id = hier.id AND hier.depth = v_depth) then
  22.  
  23. INSERT INTO hier
  24. SELECT p.parent_type_id, p.id, v_depth + 1 FROM item_types_view p
  25. INNER JOIN tmp ON p.parent_type_id = tmp.id AND tmp.depth = v_depth;
  26.  
  27. SET v_depth = v_depth + 1;
  28.  
  29. TRUNCATE TABLE tmp;
  30. INSERT INTO tmp SELECT * FROM hier WHERE depth = v_depth;
  31.  
  32. else
  33. SET v_done = 1;
  34. end IF;
  35.  
  36. end while;
  37.  
  38. SELECT count(tmp_items.id) AS count FROM (
  39. SELECT
  40. DISTINCT items.id
  41. FROM
  42. (SELECT DISTINCT * FROM items) AS items
  43. INNER JOIN hier ON hier.id = items.type_id
  44. LEFT JOIN districts ON districts.id = items.district_id
  45. LEFT JOIN item_types_view p ON items.type_id = p.id
  46. WHERE
  47. items.is_active = true) tmp_items;
  48.  
  49. DROP TEMPORARY TABLE IF EXISTS hier;
  50. DROP TEMPORARY TABLE IF EXISTS tmp;
  51.  
  52. end

Co w tym przypadku generuje błąd? Proszę o pomoc.

Pozdrawiam.
sazian
w pma w polu separator wpisałeś coś innego niż średnik questionmark.gif np $$
Pite(R)
Poprosiłbym o skonkretyzowanie, bo nie do końca rozumiem, o co chodzi. Ogólnie zapytania oddzielam średnikiem i to działa, generalnie nic nie zmieniałem w ustawieniach pMA, większość rzeczy powinna być ustawiona "standardowo".
sazian
ok jak dobrze rozumiem to wchodzisz w zakładkę SQL i tak wklejasz kod procedury, tak ?
jeśli tak to pod tym dużym polem do wpisywania kodu SQL jest mniejsze(separator) i tam musisz wpisać np. $$

jeśli robisz to przez import do na początku(przed procedurą) dopisz DELIMITER $$
Pite(R)
Ok, zrozumiałem o co chodzi, wszystko już pięknie ruszyło smile.gif
Dzięki za pomoc!
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.