#navi(../)
* MySQLのPREPAREでPreparedStatementsを作成する方法 [#vbd1e6a6]
JavaのPreparedStatementや、PHPの$dbh->prepare(...)などと同じような動作をMySQLを使用してSQL文で実現する方法を以下に記します。
#contents
#htmlinsertpcsp(db-top.html,db-sp.html)
* 関連記事 [#jd762c56]
-[[PostgreSQLのPREPAREでPreparedStatementsを作成する方法>PostgreSQL/PREPAREでPreparedStatementsを作成する]]
-[[MySQLでPREPAREしたクエリーを削除する方法・DEALLOCATE>MySQL/PREPAREしたクエリーを削除する方法・DEALLOCATE]]
-[[PostgreSQLでPREPAREしたクエリーを削除する方法・DEALLOCATE>PostgreSQL/PREPAREしたクエリーを削除する方法・DEALLOCATE]]
* 動作確認環境 [#sf4ed90a]
以下の環境で動作確認を行いました。
-OS~
CentOS6 x86_64
-MySQL~
MySQL 5.1.66
* MySQLでPREPAREを使ってみる [#vaafebef]
PREPAREを使うとSQLの一時的な関数(のようなもの)を作成することができます。
以下にいくつかのPREPARE使用例を記します。
尚、このPREPAREで指定した設定内容は接続が切れると無くなります。
** select now(); を PREPAREしてみる [#qafb1c4d]
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を添付しておきます。
#ref(prepare01.sql)
以下のようにすれば端末から実行できます。
$ mysql -u root -p < prepare01.sql
Enter password:
now()
2013-01-23 22:45:37
** PREPAREで引数を指定する例 [#qae8bf65]
以下にPREPAREクエリーで引数を指定する方法を以下に記します。~
(以下の記述はデータベース名dbが存在することを前提に記述しています。)
+データベースdb1を作成しdb1を使用する
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)
+ PREPAREをつかってins_sqlを定義する
mysql> prepare ins_sql from 'insert into foo values(?,?)';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
+ PREPAREをつかってupd_sqlを定義する
mysql> prepare upd_sql from 'update foo set b=? where a=?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
+ setで@a, @bに値を設定
mysql> set @a=2 ;
Query OK, 0 rows affected (0.00 sec)
mysql> set @b='ajisai';
Query OK, 0 rows affected (0.00 sec)
+ execute クエリー名(ins_sql) using 値...で@a,@bの値をインサート
mysql> execute ins_sql using @a, @b;
Query OK, 1 row affected (0.00 sec)
+ ins_sqlで追加されたデータを確認
mysql> select * from foo;
+------+--------+
| a | b |
+------+--------+
| 1 | sakura |
| 2 | ajisai |
+------+--------+
2 rows in set (0.00 sec)
+ setで@c,@dの値を設定
mysql> set @c='AJISAI';
Query OK, 0 rows affected (0.00 sec)
mysql> set @d=2;
Query OK, 0 rows affected (0.00 sec)
+ execute クエリー名(upd_sql)でajisai(小文字)をAJISAI(大文字)にアップデートする
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を添付しておきます。
#ref(prepare02.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
#htmlinsertpcsp(db-btm.html,db-sp.html)