mysql - 过程中的光标不返回任何值

标签 mysql loops cursor procedure

我有一个创建临时表的数据库,这些表名称是随机生成的并保存在 Checkouts.unid 中。我想删除所有这些表并截断表 Checkouts。我认为最好的解决方案是一个程序,但它不起作用:

DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`;
CREATE PROCEDURE `spCheckoutsCleanup` ()
  SQL SECURITY INVOKER
BEGIN
    DECLARE `t` VARCHAR(64);
    DECLARE `ch` CURSOR FOR SELECT `unid` FROM `Checkouts`;
    OPEN `ch`;

    drop_tables: LOOP
        FETCH `ch` INTO `t`;
        DROP TABLE IF EXISTS `t`;
    END LOOP;

    CLOSE `ch`;
    TRUNCATE TABLE `Checkouts`;
END

尽管这些表在那里并且表 Checkouts 不为空,但我总是收到“没有数据 - 提取、选择或处理零行”。

最佳答案

您必须添加类似的内容才能结束循环:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET ...;

参见 documentation. 中的示例。例如。 ...

DROP PROCEDURE IF EXISTS `spCheckoutsCleanup`;
CREATE PROCEDURE `spCheckoutsCleanup` ()
  SQL SECURITY INVOKER
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE `t` VARCHAR(64);
    DECLARE `ch` CURSOR FOR SELECT `unid` FROM `Checkouts`;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN `ch`;

    drop_tables: LOOP
        FETCH `ch` INTO `t`;
        IF done THEN
           LEAVE drop_tables;
        END IF;
        DROP TABLE IF EXISTS `t`;
    END LOOP;

    CLOSE `ch`;
    TRUNCATE TABLE `Checkouts`;
END

否则,一旦到达光标末尾,您就会收到错误消息。

关于mysql - 过程中的光标不返回任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095425/

相关文章:

mysql - 试图从 .asp 页面连接到远程 mysql

MySQL 表每 30 分钟行一次

html - 具有自定义 url 的光标属性无法在 Chrome 中正确显示

java - postgresql存储过程中的结果集就像java一样

mysql - 与 mysql 比较的有趣结果

php - 文件上传总是失败

sql - mysql简单聚合子查询结果很慢

shell - 循环 curl 调用并在出现错误之前计算成功响应

python - 循环遍历列表然后在 python 中使用双循环的更有效方法

windows - 如何在 Windows 中隐藏光标? (德尔福)