2016-11-17 26 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