#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)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS