我想在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 ;
答案 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 ;