MySQLストアドプロシージャで動的SQLをどのように構築して使用しますか?
MySQLが動的SQLをサポートするとは思わない。似ているが異なる「準備済み」ステートメントを実行できます。
以下に例を示します。
mysql> PREPARE stmt FROM
-> 'select count(*)
-> from information_schema.schemata
-> where schema_name = ? or schema_name = ?'
;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt
-> USING @schema1,@schema2
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE stmt;
準備されたステートメントは、特定のクエリの実行プランを確認するためによく使用されます。 executeコマンドで実行され、sqlを割り当てることができるため変数を使用すると、動的SQLと同じ動作のいくつかを近似できます。
これについては link を参照してください。
最後の行を使用してstmt
の割り当てを解除することを忘れないでください!
がんばろう!
5.0.13以降では、ストアドプロシージャで動的SQLを使用できます。
delimiter //
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
SET @s = CONCAT('SELECT ',col,' FROM ',tbl );
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
//
delimiter ;
動的SQLは、関数またはトリガーでは機能しません。その他の使用法については、 MySQLのドキュメント をご覧ください。
ユーザー定義変数を使用して動的ステートメントの外側を通過できます
Server version: 5.6.25-log MySQL Community Server (GPL)
mysql> PREPARE stmt FROM 'select "AAAA" into @a';
Query OK, 0 rows affected (0.01 sec)
Statement prepared
mysql> EXECUTE stmt;
Query OK, 1 row affected (0.01 sec)
DEALLOCATE prepare stmt;
Query OK, 0 rows affected (0.01 sec)
mysql> select @a;
+------+
| @a |
+------+
|AAAA |
+------+
1 row in set (0.01 sec)