JavaのPreparedStatementや、PHPの$dbh->prepare(...)などと同じような動作をMySQLを使用してSQL文で実現する方法を以下に記します。
以下の環境で動作確認を行いました。
PREPAREを使うとSQLの一時的な関数(のようなもの)を作成することができます。 以下にいくつかのPREPARE使用例を記します。 尚、このPREPAREで指定した設定内容は接続が切れると無くなります。
mysqlコマンドで接続し以下のように入力します。 select now();をshow_nowという名前で登録します。 execute show_now;でPREPAREで指定したSQLが実行されているのが確認できます。
mysql> PREPARE show_now FROM -> 'SELECT now()'; Query OK, 0 rows affected (0.00 sec) Statement prepared mysql> EXECUTE show_now; +---------------------+ | now() | +---------------------+ | 2013-01-23 22:42:55 | +---------------------+ 1 row in set (0.00 sec)
上記で操作したSQLを添付しておきます。
以下のようにすれば端末から実行できます。
$ mysql -u root -p < prepare01.sql Enter password: now() 2013-01-23 22:45:37
以下にPREPAREクエリーで引数を指定する方法を以下に記します。
(以下の記述はデータベース名dbが存在することを前提に記述しています。)
mysql> create database db1; Query OK, 1 row affected (0.00 sec) mysql> use db1; Database changed
mysql> create table foo (a int, b text); Query OK, 0 rows affected (0.03 sec)
mysql> insert into foo values(1,'sakura'); Query OK, 1 row affected (0.00 sec)
mysql> select * from foo; +------+--------+ | a | b | +------+--------+ | 1 | sakura | +------+--------+ 1 row in set (0.00 sec)
mysql> prepare ins_sql from 'insert into foo values(?,?)'; Query OK, 0 rows affected (0.00 sec) Statement prepared
mysql> prepare upd_sql from 'update foo set b=? where a=?'; Query OK, 0 rows affected (0.00 sec) Statement prepared
mysql> set @a=2 ; Query OK, 0 rows affected (0.00 sec) mysql> set @b='ajisai'; Query OK, 0 rows affected (0.00 sec)
mysql> execute ins_sql using @a, @b; Query OK, 1 row affected (0.00 sec)
mysql> select * from foo; +------+--------+ | a | b | +------+--------+ | 1 | sakura | | 2 | ajisai | +------+--------+ 2 rows in set (0.00 sec)
mysql> set @c='AJISAI'; Query OK, 0 rows affected (0.00 sec) mysql> set @d=2; Query OK, 0 rows affected (0.00 sec)
mysql> execute upd_sql using @c, @d; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from foo; +------+--------+ | a | b | +------+--------+ | 1 | sakura | | 2 | AJISAI | +------+--------+ 2 rows in set (0.00 sec)
上記で操作したSQLを添付しておきます。
以下のようにすれば端末から実行できます。
$ mysql -u root -p < prepare02.sql Enter password: a b 1 sakura a b 1 sakura 2 ajisai a b 1 sakura 2 AJISAI