2016-11-17 6 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構文エラーを通知します。ここでEDIT 1

は、プロシージャ私はから "@" を削除した場合を除き、機能しませんexempleある "@my_name INTO curseur1をFETCH;" :

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日午前16時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

関連する問題