通常は各プログラム言語側で プレースホルダ含みの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)
このステートメントを直接使うシーンというのが、私には余り思い浮かばないのだけど、ストアド・プロシージャを書くときなどに便利になるのかなぁ。