2016-11-17 27 views
0

是否可以將遊標變量讀入局部變量?這樣我就可以將它們用於準備好的聲明中。將光標變量讀入局部變量

OPEN curseur2; 
      LOOP2: LOOP 
       SET no_more_rows = FALSE; 
       FETCH curseur2 INTO @a, @b, @c; 
       IF no_more_rows THEN 
        CLOSE curseur2; 
        LEAVE LOOP2; 
       END IF; 

       EXECUTE stmtCountBrut USING @a,@b,@c; 

這只是給我一個SQL語法錯誤。

編輯1

這裏是一個過程爲例,不只是如果我刪除從 「@」 工作 「Fetch curseur1 INTO @my_name;」 :

DROP PROCEDURE IF EXISTS `01_input_brut`.test_cursor; 
CREATE DEFINER=`root`@`%` PROCEDURE `test_cursor`() 
BLOCK1: BEGIN 
    DECLARE no_more_rows1 INT; 
    DECLARE my_name VARCHAR(255); 
    DECLARE civility VARCHAR(255); 

    DECLARE curseur1 CURSOR FOR 
     SELECT `name` 
     FROM source; 

    DECLARE CONTINUE handler FOR NOT FOUND SET no_more_rows1 = TRUE; 

    OPEN curseur1; 

    LOOP1: LOOP 
       set no_more_rows1 = false; 
     FETCH curseur1 INTO @my_name; 
     IF no_more_rows1 THEN 
      CLOSE curseur1; 
      LEAVE LOOP1; 
     END IF; 

INSERT INTO log (id, message, date) VALUES (NULL, @my_name, NOW()); 


    END LOOP LOOP1;  
END BLOCK1; 

錯誤:

[2016年11月17日十六時19分34秒] [42000] [1064]你在你的SQL語法 有一個錯誤;查看與您的MySQL服務器版本 相對應的手冊,查看在@my_name附近使用的正確語法; IF no_more_rows1 THEN CLOSE curseur1; 「在第17行

+0

@fancyPants你是什麼意思? – Kvn91

+0

你的代碼是否在程序中? –

+0

@ P.Salmon是的,請參閱我的編輯作爲示例程序 – Kvn91

回答

0

嘗試:

DROP TABLE IF EXISTS `source`; 
DROP TABLE IF EXISTS `log`; 
DROP PROCEDURE IF EXISTS `test_cursor`; 

CREATE TABLE IF NOT EXISTS `source` (
    `name` VARCHAR(255) 
); 

CREATE TABLE IF NOT EXISTS `log` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    `message` VARCHAR(255), 
    `date` DATETIME 
); 

INSERT INTO `source` (`name`) 
VALUES ('name 1'); 

DELIMITER // 

CREATE PROCEDURE `test_cursor`() 
`BLOCK1`: BEGIN 
    -- DECLARE `no_more_rows1` INT; 
    DECLARE `no_more_rows1` BOOL DEFAULT FALSE; 
    DECLARE `my_name` VARCHAR(255); 
    -- DECLARE `civility` VARCHAR(255); 

    DECLARE `curseur1` CURSOR FOR 
    SELECT `name` 
    FROM `source`; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET `no_more_rows1` := TRUE; 

    OPEN `curseur1`; 

    `LOOP1`: LOOP 
    -- set no_more_rows1 = false; 
    -- FETCH curseur1 INTO @my_name; <- User-Defined Variable. See http://dev.mysql.com/doc/refman/5.7/en/user-variables.html 
    FETCH `curseur1` INTO `my_name`; 
    IF `no_more_rows1` THEN 
     CLOSE `curseur1`; 
     LEAVE `LOOP1`; 
    END IF; 

    INSERT INTO `log` (`id`, `message`, `date`) 
    -- VALUES (NULL, @my_name, NOW()); 
    VALUES (NULL, `my_name`, NOW()); 
    END LOOP `LOOP1`; 
END `BLOCK1`// 

DELIMITER ; 

CALL `test_cursor`; 

SELECT `name` 
FROM `source`; 

SELECT `id`, `message`, `date` 
FROM `log`; 

SQL Fiddle demo