2016-04-13 13 views
0

私は、すべてのテーブルをスキーマのすべてのテーブルに繰り返し書き込んで、すべてのテーブルをさらに変更しようとしています。私はそれを呼び出すときしかし、それは、このメッセージを返し、私は理由を理解することはできません。MySQLのプロシージャが正常に動作しません。

エラーコード:1329データなし - ゼロ行が選択された、または彼女は、プロシージャのコード自体である

を処理し、フェッチ:

delimiter # 
drop procedure if exists myschema.create_triggers # 
create procedure myschema.create_triggers() 
begin 
    declare tname CHAR(255); 
    declare result VARCHAR(255); 

    declare cTab cursor for select table_name from information_schema.tables where table_schema = 'myschema'; 
    open cTab; 
    tLoop: LOOP 
    fetch cTab into tname; 
    SET result = CONCAT(result, tname, ',');  
    end LOOP tLoop; 

    select result; 
end # 

カーソルクエリは正常に動作しますが、なぜこの手順では期待通りの結果が得られないのですか?

答えて

1

CONTINUE HANDLERがありません。 continueハンドラは、カーソルがすべての行を処理したときの処理をMySQLに指示します。

例はhereです。

引用:

カーソルの宣言は、ハンドラの宣言の前に、変数と条件の宣言の後に現れなければなりません。

Example: 

CREATE PROCEDURE curdemo() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE a CHAR(16); 
    DECLARE b, c INT; 
    DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; 
    DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur1; 
    OPEN cur2; 

    read_loop: LOOP 
    FETCH cur1 INTO a, b; 
    FETCH cur2 INTO c; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    IF b < c THEN 
     INSERT INTO test.t3 VALUES (a,b); 
    ELSE 
     INSERT INTO test.t3 VALUES (a,c); 
    END IF; 
    END LOOP; 

    CLOSE cur1; 
    CLOSE cur2; 
END; 

一般的にハンドラの詳細については、here見つけることができます。

+0

私のコードにこれを追加しましたが、問題は解決されません。カーソルクエリが13行を返す間は何もしません。 nullレスポンスではなく、コロンで区切られたすべてのテーブルを参照することを期待しています。カーソルクエリの応答:13行が返されました – smoczyna

+0

新しいバージョンのプロシージャを質問に編集してください。 – fancyPants

+0

私はこの行が問題を引き起こすと信じています: "SET result = CONCAT(result、tname、 '、');"ループ内に "select tname"を置くと、テーブル名を含む13の結果が返されるためです。最終的なステップはこの行をトリガー作成句に置き換えるので、実際に私が望むことをしています。あなたの助けをありがとう、私はループ内のトリガー作成と闘うと思うが、それは別の話です。 – smoczyna

関連する問題