2014-02-10 4 views
0

Пытаясь создать мою первую хранимую процедуру, я много исследовал и не смог найти способ ввода кода через phpMyAdmin, поэтому загрузил MYSQL Workbench 6.0 и поместил мой скрипт таким образом, но он бросает a 2014 error (Commands out of sync, you cannot run this command now). Однако я замечаю, что Workbench, похоже, создает две строки - первая говорит, что работает, а вторая - ошибка.Создание хранимой процедуры Mysql получает ошибку 2014

Подпрограмма заключается в обновлении трех таблиц и вставке в другую при выдаче контракта. Контракты состоят из связок, и они, в свою очередь, состоят из элементов, которые связаны с конкретными проблемами в другой таблице.

Это мой код или я должен включить в конце команду очистки в конце, и если да, то что это должно быть? Вход процедуры - это идентификатор контракта, идентификатор пользователя и его IP-адрес (для ведения журнала).

В PHP, когда, в конечном итоге, используя CALL, как я могу очистить результаты, как я вижу, что ответы Stackoverflow 2014 отвечают на то, что не выполняется второй вызов? Также, как я могу получить это на сервере ubuntu либо через phpMyAdmin, либо с помощью шпатлевки, где должен работать ftp-скрипт sql?

DELIMITER // 

DROP PROCEDURE IF EXISTS ContrctAwardStatusLog; 

CREATE PROCEDURE ContrctAwardStatusLog(IN c_Id INT(8), IN u_Id INT(11), IN u_Ip varchar(20)) 
BEGIN 
    Block1: BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE b_id INT DEFAULT 0; 
    DECLARE citm_id INT DEFAULT 0; 
    DECLARE r_id INT DEFAULT 0; 
    DECLARE c_1 CURSOR FOR SELECT bundle_id FROM bundles WHERE contract_id = c_Id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN c_1; 
    REPEAT 
     FETCH c_1 INTO b_id ; 

     Block2: BEGIN 
     DECLARE done2 INT DEFAULT 0; 
     DECLARE c_2 CURSOR FOR SELECT contitem_id, issue_id FROM c_items WHERE bundle_id= b_id; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; 

     OPEN c_2; 
     REPEAT 
      FETCH c_2 INTO citm_id r_id; 
      INSERT INTO track_status (rowid, WStatusBy, WStatus, WStatusWhen) VALUES(r_id, u_Id, 13,NOW()); 
      UPDATE h_issues SET WStatus='13' WHERE RowID = r_id; 
      UPDATE c_items SET act_state='13' WHERE contitem_id=citm_id; 

      UNTIL done2 
     END REPEAT; 
     CLOSE c_2; 
     END Block2; 

     UPDATE bundles SET bundle_stat = '13' WHERE bundle_id = b_id; 
     UNTIL done 
    END REPEAT; 

    CLOSE c_1; 
    END Block1; 

END // 

DELIMITER ; 

ответ

0

Я, наконец, отсортировал это самостоятельно.

Мне нужно было установить DROP ..if ДО ДОЛЖНОСТЕЙ DELIMITER, и в поле FETCH произошла синтаксическая ошибка после OPEN c_2. В нем отсутствовал разделитель запятой.

DROP PROCEDURE IF EXISTS ContrctAwardStatusLog; 

DELIMITER // 

CREATE PROCEDURE ContrctAwardStatusLog(IN c_Id INT(8), IN u_Id INT(11), IN u_Ip varchar(20)) 
BEGIN 
    Block1: BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE b_id INT DEFAULT 0; 
    DECLARE citm_id INT DEFAULT 0; 
    DECLARE r_id INT DEFAULT 0; 
    DECLARE c_1 CURSOR FOR SELECT bundle_id FROM bundles WHERE contract_id = c_Id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN c_1; 
    REPEAT 
     FETCH c_1 INTO b_id ; 

     Block2: BEGIN 
     DECLARE done2 INT DEFAULT 0; 
     DECLARE c_2 CURSOR FOR SELECT contitem_id, issue_id FROM c_items WHERE bundle_id= b_id; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; 

     OPEN c_2; 
     REPEAT 
      FETCH c_2 INTO citm_id, r_id; 
      INSERT INTO track_status (rowid, WStatusBy, WStatus, WStatusWhen) VALUES(r_id, u_Id, 13,NOW()); 
      UPDATE h_issues SET WStatus='13' WHERE RowID = r_id; 
      UPDATE c_items SET act_state='13' WHERE contitem_id=citm_id; 

      UNTIL done2 
     END REPEAT; 
     CLOSE c_2; 
     END Block2; 

     UPDATE bundles SET bundle_stat = '13' WHERE bundle_id = b_id; 
     UNTIL done 
    END REPEAT; 

    CLOSE c_1; 
    END Block1; 

END // 

DELIMITER ; 
+0

Операция 'DROP ..' также может быть определена после определения нового' разделителя'. Но чтобы заставить капли выполняться раньше, вы должны были использовать новый разделитель, чтобы закрыть оператор drop. –

+0

Я удаляю свой ответ, поскольку он действительно не выбирает утверждение, вызвавшее ошибку. –

Смежные вопросы