繁体   English   中英

存储过程在MySql中无法正常工作?

[英]Stored procedure not working properly in MySql?

我正在调试一个SQL存储过程,该存储过程必须根据表C中存在的值(ID)从表A获取值(在我的代码ID和Numb中),然后将Numb平方并存储在表B中,即所有事物ID,麻木和正方形。 我无法在下面的代码中找出问题

 DELIMITER $$
    CREATE PROCEDURE matlab.squaring
     BEGIN
       DECLARE finish BOOLEAN DEFAULT 0; # <- set up initial conditions
       DECLARE square BIGINT(10);
       DECLARE ID INT(10);
       DECLARE Numb INT (10);
       DECLARE id_cur CURSOR FOR
         SELECT ID, Numb FROM A WHERE EXISTS ( SELECT ID FROM c);
         SET @square= @Numb * @Numb

           INSERT INTO B
           (
             ID ,
             Numb ,
             square
           )     values ( ID , Numb, square);


       DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = TRUE;
       OPEN id_cur;

     the_loop : LOOP
        FETCH id_cur INTO ID;

        IF finish THEN
           CLOSE id_cur;
           LEAVE the_loop;
        END IF
    END LOOP the_loop;
    END$$

当我运行存储过程时,弹出的错误是“您的代码中似乎存在语法错误,请参阅MYSql指南。”

编辑:另外一个帮助,请如何执行此存储过程。

  • 在Matlab程序之后,您错过了()个...
  • 和; END IF之后
  • 另外,HANDLER声明应在任何可执行代码之前和CURSOR声明之后
  • SET @ square = @Numb *后需要分号

因此,查询应如下所示:

    DELIMITER $$
CREATE PROCEDURE matlab.squaring ()
 BEGIN
   DECLARE finish BOOLEAN DEFAULT 0; # <- set up initial conditions
   DECLARE square BIGINT(10);
   DECLARE ID INT(10);
   DECLARE Numb INT (10);
   DECLARE id_cur CURSOR FOR
     SELECT ID, Numb FROM A WHERE EXISTS ( SELECT ID FROM c);
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = TRUE;
     SET @square= @Numb * @Numb;

       INSERT INTO B
       (
         ID ,
         Numb ,
         square
       )     values ( ID , Numb, square);

   OPEN id_cur;

 the_loop : LOOP
    FETCH id_cur INTO ID;

    IF finish THEN
       CLOSE id_cur;
       LEAVE the_loop;
    END IF;
END LOOP the_loop;
END$$

endif缺少参数括号和分号。

DELIMITER $$
    CREATE PROCEDURE squaring()
     BEGIN
       DECLARE finish BOOLEAN DEFAULT 0; # <- set up initial conditions
       DECLARE square BIGINT(10);
       DECLARE ID INT(10);
       DECLARE Numb INT (10);
       DECLARE id_cur CURSOR FOR
       SELECT ID, Numb FROM A WHERE EXISTS ( SELECT ID FROM c);
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = TRUE;
       SET @square= @Numb * @Numb;

           INSERT INTO B
           (
             ID ,
             Numb ,
             square
           )     values ( ID , Numb, square);


       OPEN id_cur;

     the_loop : LOOP
        FETCH id_cur INTO ID;

        IF finish THEN
           CLOSE id_cur;
           LEAVE the_loop;
        END IF;
    END LOOP the_loop;
    END$$

有各种小错误;

您需要一个参数列表,即使该过程为空。

CREATE PROCEDURE matlab.squaring()

继续处理程序必须在其他声明的下面;

   DECLARE id_cur CURSOR FOR
     SELECT ID, Numb FROM A WHERE EXISTS ( SELECT ID FROM c);
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET @finish = TRUE;

您忘记了分号;

SET @square= @Numb * @Numb;

您忘记了@的可变用法;

   )     values ( @ID , @Numb, @square);

您在END IF上忘记了分号

    END IF;

只是概述,这里是完整的更新内容;

CREATE PROCEDURE matlab.squaring()
 BEGIN
   DECLARE finish BOOLEAN DEFAULT 0; # <- set up initial conditions
   DECLARE square BIGINT(10);
   DECLARE ID INT(10);
   DECLARE Numb INT (10);
   DECLARE id_cur CURSOR FOR
     SELECT ID, Numb FROM A WHERE EXISTS ( SELECT ID FROM c);
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET @finish = TRUE;
   SET @square= @Numb * @Numb;

   INSERT INTO B
   (
     ID ,
     Numb ,
     square
   )     values ( @ID , @Numb, @square);

 OPEN id_cur;

 the_loop : LOOP
    FETCH id_cur INTO ID;

    IF finish THEN
       CLOSE id_cur;
       LEAVE the_loop;
    END IF;
END LOOP the_loop;
END//

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM