0

ストアド プロシージャに次の動的クエリを記述しました。

FETCH cur1 INTO a1, ldt1, b1;
    WHILE DONE = 0 DO

        SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ldt1,opid = b1 
        WHERE hq_conferee_seqno=a1 AND (LoggedDateTime <=ldt1 AND connectedDateTime IS NULL)');
        FETCH cur1 INTO a1, ldt1, b1;
        PREPARE stmt FROM @s;
        EXECUTE stmt;
    END WHILE; 
    CLOSE cur1;

保存されたものをコンパイルすると、エラーは発生しません。しかし、このコードを実行すると、SQL 構文にエラーがあります。1行目の「NULL」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

何が問題になるでしょう。私を助けてください。前もって感謝します。

4

1 に答える 1

0

マニュアルに記載されているように:

ローカル変数は、ストアド プログラムの実行中にのみ有効です。それらへの参照は、準備されたステートメント内では許可されていません。これらは現在のセッションに対してグローバルであり、ステートメントの実行時に変数が範囲外になる可能性があるためです。

代わりに、カーソルをユーザー変数にフェッチし、プリペアド ステートメントからそれらを参照するか (接続中はスコープ内に留まります)、または (できれば) プリペアド ステートメントにパラメータとして渡します。

SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ?,opid = ? 
WHERE hq_conferee_seqno=? AND (LoggedDateTime <=? AND connectedDateTime IS NULL)');
FETCH cur1 INTO @a1, @ldt1, @b1;
PREPARE stmt FROM @s;
EXECUTE stmt USING @ldt1, @b1, @a1, @ldt1;
于 2012-05-11T09:35:00.247 に答える