当我有一个"WHERE"消息时,为什么我的存储过程会抛出错误“无数据-提取,选择或处理了零行"?在声明中? [英] Why does my stored procedure throw error 'No data - zero rows fetched, selected, or processed' when I have a "WHERE" in the statement?

查看:84
本文介绍了当我有一个"WHERE"消息时,为什么我的存储过程会抛出错误“无数据-提取,选择或处理了零行"?在声明中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仔细检查了这个选择语句,它肯定返回行:

I have double checked this select statement and it definitely returns rows:

SELECT name, id FROM MyTable WHERE id > 3;

但是当我为游标执行此操作时,它说没有获取任何数据!

But when I do it for a cursor, it says no data fetched!

DROP PROCEDURE IF EXISTS Test;
DELIMITER //

CREATE PROCEDURE Test()
BEGIN

    -- Our columns
    DECLARE name VARCHAR(45);
    DECLARE id INT DEFAULT -1;

    -- Our cursor
    DECLARE cur CURSOR FOR SELECT name, id FROM MyTable WHERE id > 3;

    DROP TEMPORARY TABLE IF EXISTS TempTest;
    CREATE TEMPORARY TABLE TempTest
    (
    name VARCHAR(45) NOT NULL,
    id INT NOT NULL
    );

    -- Open our cursor
    open cur;

    -- Start our for loop
    forLoop: LOOP

    -- Get the row
    FETCH cur INTO name, id;

    INSERT INTO TempTest (name, id)
    VALUES ( name, id);

    END LOOP forLoop;

    -- Close the cursor
    CLOSE cur;

    -- NOW GET THE RESULTS
    SELECT * FROM TempTest;

END; //

DELIMITER ;

CALL Test();

它引发错误:

[1329]无数据-提取,选择或处理了零行

[1329] No data - zero rows fetched, selected, or processed

推荐答案

您必须定义一个继续处理程序:

you must define a continue handler:

DROP PROCEDURE IF EXISTS Test;
DELIMITER //

CREATE PROCEDURE Test()
BEGIN

    -- Our columns
    DECLARE name VARCHAR(45);
    DECLARE id INT DEFAULT -1;
    DECLARE done INT DEFAULT 0;
    -- Our cursor
    DECLARE cur CURSOR FOR SELECT name, id FROM MyTable WHERE id > 3;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    DROP TEMPORARY TABLE IF EXISTS TempTest;
    CREATE TEMPORARY TABLE TempTest
    (
    name VARCHAR(45) NOT NULL,
    id INT NOT NULL
    );

    -- Open our cursor
    open cur;

    -- Start our for loop
    forLoop: LOOP

    -- Get the row
    FETCH cur INTO name, id;
     IF done = 1 THEN
        LEAVE forLoop;
    END IF;
    INSERT INTO TempTest (name, id)
    VALUES ( name, id);

    END LOOP forLoop;

    -- Close the cursor
    CLOSE cur;

    -- NOW GET THE RESULTS
    SELECT * FROM TempTest;

END; //

DELIMITER ;

这篇关于当我有一个"WHERE"消息时,为什么我的存储过程会抛出错误“无数据-提取,选择或处理了零行"?在声明中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆