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に感謝

Source: https://habr.com/ru/post/J52983/


All Articles