同様のストアド プロシージャがあります (ただし、より長い)。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 変数で処理できるようにすることはできますか、それとも準備済みステートメントの制約ですか?
よろしく。