我在遵循MySql存储过程时遇到问题,当我尝试从控制台和通过应用程序运行它时,都给出了SQLException,说光标没有打开,有人可以告诉我为什么它没有打开吗?

 DELIMITER $$
DROP PROCEDURE IF EXISTS DELETE_EXPIRED_GIFTS_SP$$
CREATE PROCEDURE DELETE_EXPIRED_GIFTS_SP()
    BEGIN
    DECLARE gift_id_val INT;
    DECLARE item_id_val INT;   
    DECLARE expiry_date DATETIME;
    DECLARE  no_more_gifts INT DEFAULT 0;
    DECLARE num_rows INT DEFAULT 0;
    DECLARE  gift_items_cur CURSOR FOR 
        SELECT user_gift_id, item_id
        FROM user_gift
        WHERE status in (1,3);

    DECLARE  CONTINUE HANDLER FOR NOT FOUND 
    SET  no_more_gifts = 1;

    OPEN gift_items_cur;
        select FOUND_ROWS() into num_rows;
        the_loop: LOOP
            FETCH  gift_items_cur  INTO   gift_id_val, item_id_val;

            IF no_more_gifts=1 THEN
                    CLOSE gift_items_cur;
                    LEAVE the_loop;
            END IF;

            SELECT end_time INTO expiry_date FROM item WHERE item_id = item_id_val;

            IF expiry_date IS NOT NULL AND expiry_date <= UTC_TIMESTAMP()
                THEN UPDATE user_gift SET status = 5 WHERE user_gift_id = gift_id_val;
            END IF;

         END LOOP the_loop;
    CLOSE  gift_items_cur;
    END$$
 DELIMITER ;

我到达这里的错误是,

  09:05:31,328 INFO  [STDOUT] FATAL: com.abc.gift.support.impl.GiftSupportImpl - ERROR: CallableSt
atementCallback; uncategorized SQLException for SQL [{call DELETE_EXPIRED_GIFTS_SP()}]; SQL state [2
4000]; error code [1326]; Cursor is not open; nested exception is java.sql.SQLException: Cursor is n
ot open

===============>>#1 票数:2 已采纳

the_loop: LOOP
    :
    IF no_more_gifts=1 THEN
        CLOSE gift_items_cur;      <<< Number 1
        LEAVE the_loop;
    END IF;
    :
END LOOP the_loop;
CLOSE  gift_items_cur;             <<< Number 2

在我看来,您在这里两次关闭了光标。

在处理程序激活并将no_more_gifts设置为1之后,您第一次关闭它。 此时,您还退出循环,然后尝试再次关闭游标

我建议将您的内部if语句更改为公正:

IF no_more_gifts=1 THEN
    LEAVE the_loop;
END IF;

  ask by bluelabel translate from so

未解决问题?本站智能推荐:

1回复

MySQL游标打开失败

因此,我试图设置一个可与游标一起使用的mysql存储过程,并且由于某种原因,游标无法打开,并且(据我所知)导致SP停止。 这是游标声明 tmpint是先前在SP中声明的变量: 它的值在这里设置: 然后,我在脚本中做了很多其他事情,所有这些似乎都工作正常,但是当我到达这一
1回复

为每个查询打开新的MySQL游标是否很慢?

我在这里看到了一些答案,这些答案在每个查询之前打开一个新的MySQL游标,然后将其关闭。 慢吗 我不应该通过将游标作为参数传递来回收游标吗? 我有一个执行无限循环的程序,因此最终连接将在默认的8小时后超时。 编辑: 根据要求,这是处理SQL查询的相关代码:
2回复

mysql嵌套游标已经打开

我有一个带有两个嵌套游标的sp。 外部光标是客户,内部光标是句点。 当内部游标发生错误时,我想回滚为特定客户所做的事情,并继续处理下一个客户。 但是,当为下一个客户执行内部游标时(发生异常之后),我收到“游标已经打开的消息” 代码如下: 客户1运行,并且//do some s
1回复

MySQL中的游标

感谢您的帮助! 我已经编写了这个非常简单的游标,但是由于某种原因,它不起作用: 如您所见,我注释掉了一行,说结果完成后离开循环。 这是因为不会执行整个过程脚本。 如果该行存在,它将不会抱怨该行导致问题,而是结束: ...在'loop; end'附近使用的正确句法错
1回复

Python:MySQL连接已打开,但无法创建游标

我正在尝试打开一个指向MySQL-DB的游标。 但我收到此错误: 'NoneType' object has no attribute 'cursor' 这是一个小的源代码: class Sample: def __init__(self): self.conn = No
1回复

连接未打开:MySql BeginTransaction

我正在尝试提交到数据库,并且收到一条异常消息,指出当我尝试执行查询时未打开。 谁能在这里解释我做错了什么? GetConnectionString(DbMap)肯定会返回正确的字符串,因为在此代码执行之前,我正在使用它来创建表。
1回复

具有游标和视图的MySQL递归存储过程未刷新

我有一个工作的MySQL 5.5存储过程,它会递归调用自己。 我需要执行一个动态SQL查询,该查询对于每个调用都是唯一的,然后循环查询中的所有值。 为此,我声明一个基于视图的游标,并在打开游标之前使用动态SQL创建一个视图。 我快速遍历游标,将一些信息捕获到伪数组变量中,然后关闭游标并
1回复

当前的MYSQL游标

错误: 1064 - 您的SQL语法出错; 检查与您的MySQL服务器版本相对应的手册,以便在感兴趣的地方附近使用正确的语法; DECLARE CONTINUE HANDLER for NOT FOUND SET done = TRUE; 打开cur_1;' 在第7行
4回复

MySQL中的游标错误

我在下一个脚本中有光标在MySQL中的下一个错误。 “脚本行:4您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'declare c_salari游标附近使用以从empleados中选择salario; 打开c_salari; '在第10行“
1回复

mysql游标执行

错误- 错误 MySQL说:文档 1329-无数据-提取,选择或处理了零行 执行后-称为存储过程 以下代码已成功执行-存储过程 我们到底缺少什么解决方案? 对此的帮助将不胜感激。