メモ:MySQLのサーバサイドでのプリペアド・ステートメント

通常は各プログラム言語側で プレースホルダ含みのSQLを書いたりするけど、
サーバ側での(というかSQLレベルでの)プリペアド・ステートメントの書き方に触れる機会があったので、メモとして記す。

テーブルの用意

 とりあえず、id と name を格納するテーブルを作ってみる。

mysql> CREATE TABLE presample (id integer, name varchar(10));                                                                   

プリペアドステートメント

 PREPARE 文にて、SQL文を宣言しておく。FROMっていうのが、なんだかムズムズするけど、こういう構文。

mysql> PREPARE ins_stmt FROM "INSERT INTO presample VALUES (? , ?)";
Query OK, 0 rows affected (0.02 sec)
Statement prepared

 
 実行には EXECUTE を使う。値は USING で与える。

mysql> SET @a=1; SET @b="SAMPLE";

mysql> EXECUTE ins_stmt USING @a, @b;
Query OK, 1 row affected (0.00 sec)

 もう一件、入れておく。特に意味はないけど1件では寂しいので。

mysql> SET @a=2; SET @b="TEST";

mysql> EXECUTE ins_stmt USING @a, @b;
Query OK, 1 row affected (0.00 sec)


 中身を見れば、当然、入っている。

mysql> SELECT * FROM presample;
+------+--------+
| id   | name   |
+------+--------+
|    1 | SAMPLE |
|    2 | TEST   |
+------+--------+


 ちなみに、今私がわかっている範囲では、即値を与えることはできない模様。 

mysql> EXECUTE ins_stmt USING (1, "SAMPLE");
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(1, "SAMPLE")' at line 1


 プリペアド・ステートメントは、メモリ上にSQL文(の内容)を保持しておく物だから、もう使わないのならば解放しておくよろし。

mysql> DEALLOCATE PREPARE ins_stmt;
Query OK, 0 rows affected (0.00 sec)


 
 このステートメントを直接使うシーンというのが、私には余り思い浮かばないのだけど、ストアド・プロシージャを書くときなどに便利になるのかなぁ。