3

編集: 注意してください: 下部に説明されているように、私が求めることは不可能です! したがって、質問は答えられます。

積み重なった親愛なる皆様へ

ストアド プロシージャのプリペアド ステートメントに構文エラーがあるという問題があります。プロシージャを実行すると構文エラーが発生しますが、"SELECT @sql;" によって返される構文を手動で実行すると発生しません。指図。コマンドが 1 つしかない場合は、プロシージャ内で問題なく実行されるため、区切り記号に関係しています。簡単に再現できるように、手順内でテーブルを使用しませんでした。

DROP PROCEDURE IF EXISTS stackoverflow_test;
DELIMITER $$

CREATE PROCEDURE stackoverflow_test ()
BEGIN   
    SET @sql = CONCAT('
        SELECT "test12" AS test1;
        SELECT "test34" AS test2;
    ');

    #return the statement from @sql
    SELECT @sql;

    #execute the statement from @sql
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

END$$
DELIMITER ;

CALL stackoverflow_test ();

これを探してみましたが、すべてのヒットは、プロシージャを定義するときの DELIMITER コマンドの一般的な使用に関するものです。これで、区切り文字がクライアント側で機能することがわかりました。サーバーに保存されているステートメントで何か他のものを使用する必要がありますか? 編集: $$ を区切り文字として使用しようとしましたが、同じ構文エラーが発生しました。

ベストチョネス

編集:不可能のようです。「準備されたステートメントの SQL 構文はマルチステートメントをサポートしていません」ソース: http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html。私にとっての解決策は、準備されたステートメントを1つのステートメントに減らし、他のステートメントを実行の周りに移動することでした。これは、他のステートメントが静的であるため、私にとってはうまくいきました。

#first static statement
DROP TABLE IF EXISTS `table`;

#dynamic statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

#second static statement
ALTER TABLE `table`
    ADD UNIQUE INDEX sdef ( `cntry`, `track`, `year` );
4

2 に答える 2

2

区切り文字を$$先頭に変更しています。

DELIMITER $$

次のようにSQLで使用する必要があります。

SET @sql = CONCAT('
    SELECT "test12" AS test1$$
    SELECT "test34" AS test2$$
');

そして他のこと:

SET @sql = CONCAT('
    SELECT "test12" AS test1;
    SELECT "test34" AS test2;
');

も当てはまらない場合は、次の方法を試してください。

SET @sql = 'SELECT "test12" AS test1$$SELECT "test34" AS test2$$';
于 2013-05-03T13:31:37.523 に答える