MySQL:ストアドプロシージャと動的SQL

誰もが一見明らかなこと、つまりテーブル、ユーザーなどの名前を渡すことでプロシージャ内にSQLクエリを作成しようとした場合、おそらく動的SQLを使用できないというエラーが発生しました。



SET @mytable= 'users' ;

SELECT * FROM @mytable;






このような設計は機能しません。 しかし、それを機能させるにはどうすればよいですか?



たとえば、データベース内のテーブルをアーカイブする手順を記述します。

この手順では、テーブル名をパラメーターとして使用し、engine = ARCHIVEを使用して別のテーブルを作成します



DELIMITER $$



DROP PROCEDURE IF EXISTS `create_archive`$$

CREATE PROCEDURE `create_archive`( IN current_table VARCHAR (50)

)

BEGIN

DECLARE template,archive_template VARCHAR (50);



-- mydata

-- mydata_20090226



SET archive_template=replace(curdate(),"-","");

SET template=CONCAT(current_table,"_",archive_template);



--

-- CREATE TABLE mydata_20090226 ENGINE_ARCHIVE

-- AS (SELECT * FROM mydata);



SET @archive_query:=CONCAT(" CREATE TABLE ",template," ENGINE=ARCHIVE AS

( SELECT * FROM ",current_table," )");



PREPARE archive_query FROM @archive_query;

EXECUTE archive_query;

DEALLOCATE PREPARE archive_query;



END $$



DELIMITER ;






動的クエリを作成するには、まずCONCAT()で収集してから、PREPARE、EXECUTEを使用して実行する必要があります。 このような方法は、プロシージャで複雑なクエリを作成するのに非常によく適用されます。 誰かが役に立つといいな。



UPD:テキストのタイプミスを修正、 Goganchicに感謝






All Articles