0

同様のストアド プロシージャがあります (ただし、より長い)。PHPから呼び出されます(ApacheのGETリクエスト)

delimiter // 
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
    SET @full_statement = CONCAT('SELECT ',col,' FROM ',tbl );
    PREPARE stmt FROM @full_statement;
    EXECUTE stmt;
END
//
delimiter ;

私が読んだところによると、@s は私のセッションが存続している限り存続する mysql セッション変数です。@s の存在は私を悩ませます。なぜなら、そのストアド プロシージャに対する 2 つの同時要求が、この「グローバル変数」で再生される可能性があるからです。だから私はこのように「@」を削除しようとしました

delimiter // 
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
    DECLARE full_statement VARCHAR(300);
    SET full_statement = CONCAT('SELECT ',col,' FROM ',tbl );
    PREPARE stmt FROM full_statement;
    EXECUTE stmt;
END
//
delimiter ;

成功せずに準備されたステートメントを構築します。

私は常に持っているようです

エラー 1064 (42000): SQL 構文にエラーがあります。near 'full_statement; を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。EXECUTE ステートメント;

  • PHP セッション内での 2 つの呼び出しに対する恐怖は本当に問題なのでしょうか? (そうでない場合、同じグローバル変数を使用して 200 のストアド プロシージャを使用するのはどうですか) ?

  • 本当に目標を達成して「@」を削除し、準備済みステートメントを単純なストアド proc 変数で処理できるようにすることはできますか、それとも準備済みステートメントの制約ですか?

よろしく。

4

1 に答える 1

1

はい、@var が必要です。

@MySQL の PREPARE ステートメントは、ストアド ルーチンで宣言されたローカル変数ではなく、「ユーザー変数」(接頭辞が ) のみを受け入れます。

これは、MySQL の WTF として長い間認識されてきました。

PHP セッション内での 2 つの呼び出しに対する恐怖は本当に問題なのでしょうか?

いいえ。グローバル変数ではなく、セッション変数です。
2 つの同時セッションには、@var の独自の値があります。

于 2013-08-19T03:12:54.617 に答える