无法在mysql的存储过程中创建游标

时间:2018-04-04 05:13:00

标签: mysql sql

我想在mysql的存储过程中创建一个Cursor。问题是,在变量初始化之后创建Cursor时会出错。有没有解决方案。

 DELIMITER //

Create procedure  sp_JB_Securities_Second_row_Insert()
   BEGIN

   DECLARE Rw_Count int; 
   set Rw_Count = (select count(*) from JB_Security_Detials):
   DECLARE cur1 CURSOR FOR select title from JB_Security_Detials limit 27, Rw_Count;


   END //
DELIMITER ;

3 个答案:

答案 0 :(得分:1)

其他人(P.Salmon)已经指出,DECLARING变量和CURSOR的顺序很重要,而且非常具体。

e.g。

  

变量声明必须出现在游标或处理程序之前   声明。

  

游标声明必须出现在处理程序声明之前和之后   变量和条件声明。

但是,切换顺序对您没有帮助,因为您希望在LIMIT子句中使用RW_Count并在CURSOR声明导致错误之前设置变量。这个限制也意味着你可以在LIMIT子句中使用变量的唯一方法是将它作为参数传递给过程(你可能不想这样做)。

幸运的是,没有必要,因为您不需要知道表中的行数以使用OFFSET和LIMIT。

SELECT语句的documentation中有一个很好的例子

  

从特定偏移量检索所有行直到结果的末尾   设置,您可以使用一些大数字作为第二个参数。这个   语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

所以,这里的解决方案是完全删除RW_Count变量并添加一个非常大的数字。

答案 1 :(得分:0)

试试这个

Create procedure  sp_JB_Securities_Second_row_Insert()
 BEGIN


  DECLARE cur1 CURSOR FOR select title from JB_Security_Detials limit  
  27,(select count(*) from JB_Security_Detials);


  END //
  DELIMITER ;

答案 2 :(得分:0)

  

试试这个

DELIMITER //


DROP PROCEDURE IF EXISTS sp_JB_Securities_Second_row_Insert()

CREATE PROCEDURE  sp_JB_Securities_Second_row_Insert()
BEGIN

 DECLARE Rw_Count INT; 
 DECLARE exit_loop BOOLEAN;  
 SET Rw_Count = (SELECT COUNT(*) FROM JB_Security_Detials);

  DECLARE Rw_Count_cursor CURSOR FOR
   "Your Query .............. "
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
   OPEN Rw_Count_cursor;
   -- start looping
   out_loop: LOOP
     -- read the name from next row into the variables 
     FETCH Rw_Count_cursor INTO col1,cl2, ...;
          "Your Query .............. "
 IF exit_loop THEN
         CLOSE Rw_Count_cursor;
         LEAVE out_loop;
     END IF;
   END LOOP out_loop;

 END//

  DELIMITER ;