2017-02-24 1 views
2

は、私は、二重このselect文をチェックし、それ間違い返す行いますステートメントに「WHERE」があると、ストアードプロシージャーで「データがありません - 行がフェッチ、選択、または処理されません」というエラーがスローされるのはなぜですか?

SELECT name, id FROM MyTable WHERE id > 3; 

をしかし、私はカーソルのためにそれを行うとき、それはデータが取り込まれたと言います!

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] No data - zero rows fetched, selected, or processed

答えて

4

続行ハンドラを定義する必要があります。

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 ; 
+2

ありがとうございました!それがまさに問題でした。 –

関連する問題