【问题标题】:Mysql stored procedure creation gets 2014 errorMysql存储过程创建得到2014错误
【发布时间】:2014-03-07 12:36:15
【问题描述】:

尝试创建我的第一个存储过程时,我进行了广泛的研究,但找不到通过 phpMyAdmin 输入代码的方法,因此下载了 MYSQL Workbench 6.0 并以这种方式放置我的脚本 - 但它抛出了 2014 error (Commands out of sync, you cannot run this command now)。但是我注意到 Workbench 似乎创建了两行 - 第一行表示正在运行,第二行表示错误。

例程是在发布合同时更新三个表并插入另一个表。合同由捆绑包组成,它们又由与另一个表中的特定问题相关的项目组成。

是我的代码还是我应该在最后包含一些清除命令,如果是的话应该是什么?程序输入是合约 id、用户 id 和他们的 IP 地址(用于日志记录)。

在 PHP 中,当最终使用 CALL 时,我将如何清除结果,因为我不断看到 Stackoverflow 2014 回答第二次调用失败的地方?另外,我怎样才能通过 phpMyAdmin 或者如果使用 putty 将它放到 ubuntu 服务器上,我应该将 sql 脚本 ftp 到哪里?

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 ;

【问题讨论】:

    标签: php mysql stored-procedures


    【解决方案1】:

    我终于自己整理了。

    我需要将 DROP ..if 存在于 DELIMITER 设置之前,并且在 OPEN c_2 之后的 FETCH 中存在语法错误。它缺少逗号分隔符。

    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 ;
    

    【讨论】:

    • DROP .. 声明也可以在定义新的delimiter 之后出现。但是要强制 drop 提前执行,你应该使用 new delimiter 来关闭 drop 语句。
    • 我正在删除我的答案,因为它确实没有选择导致错误的语句。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2015-06-14
    • 2020-06-28
    • 2019-11-05
    • 2018-09-01
    • 2015-05-09
    相关资源
    最近更新 更多