#navi(../)
* PostgreSQLのPREPAREでPreparedStatementsを作成する方法 [#g62acd27]
JavaのPreparedStatementや、PHPの$dbh->prepare(...)などと同じような動作をPostgreSQLを使用してSQL文で実現する方法を以下に記します。~

#contents
#htmlinsertpcsp(db-top.html,db-sp.html)

* 関連記事 [#b75ddd60]
-[[MySQLのPREPAREでPreparedStatementsを作成する方法>MySQL/PREPAREでPreparedStatementsを作成する]]
-[[MySQLでPREPAREしたクエリーを削除する方法・DEALLOCATE>MySQL/PREPAREしたクエリーを削除する方法・DEALLOCATE]]
-[[PostgreSQLでPREPAREしたクエリーを削除する方法・DEALLOCATE>PostgreSQL/PREPAREしたクエリーを削除する方法・DEALLOCATE]]

* 動作確認環境 [#yf32efa4]
以下の環境で動作確認を行いました。
- OS~
CentOS6 x86_64
- PostgreSQL~
PostgreSQL 8.4.13

* PREPAREを使ってみる [#s8bfdb3d]
PREPAREを使うとSQLの一時的な関数(のようなもの)を作成することができます。~
以下にいくつかのPREPARE使用例を記します。~
尚、このPREPAREで指定した設定内容は接続が切れると無くなります。

** select now(); を PREPARE [#rd597821]
psqlで接続し以下のように入力します。~
select now();をshow_nowという名前で登録します。~
execute show_now;でPREPAREで指定したSQLが実行されているのが確認できます。
 sakura=# PREPARE show_now as
 sakura-# select now();
 PREPARE
 sakura=# EXECUTE show_now;
              now              
 ------------------------------
  2013-01-23 21:23:58.49768+09
 (1 行)
上記で操作したSQLを添付しておきます。
#ref(prepare01.sql)

以下のようにすれば端末から実行できます。
 psql < prepare01.sql
実行結果
 $ psql < prepare01.sql 
 PREPARE
               now              
 -------------------------------
  2013-01-23 21:28:05.100399+09
 (1 行)

** PREPAREで引数を指定する方法 [#eba31a54]
JavaやPHPのPreparedStatementを使う場合、?を使いますよね。~
以下、PREPAREで引数を指定する方法を記します。
+ テーブルの作成
 sakura=# CREATE TABLE foo (a int, b text);
 CREATE TABLE
+ データのインサート
 sakura=# INSERT INTO foo VALUES(1,'sakura');
 INSERT 0 1
+ データの確認
 sakura=# SELECT * FROM foo;
  a |   b    
 ---+--------
  1 | sakura
 (1 行)
+ PREPAREでINS_SQLを定義
 sakura=# PREPARE INS_SQL (integer, varchar) AS
 sakura-# INSERT INTO foo VALUES($1, $2);
 PREPARE
+ PREPAREでUPD_SQLを定義
 sakura=# PREPARE UPD_SQL (integer, varchar) AS
 sakura-# UPDATE foo SET b=$2 WHERE a=$1;
 PREPARE
+ EXECUTEを使ってINS_SQLを実行
 sakura=# EXECUTE INS_SQL(2,'tsubaki');
 INSERT 0 1
 sakura=# EXECUTE INS_SQL(3,'suzuran');
 INSERT 0 1
+ 上記で実行したINS_SQLでデータがインサートされているかを確認
 sakura=# SELECT * FROM foo;
  a |    b    
 ---+---------
  1 | sakura
  2 | tsubaki
  3 | suzuran
 (3 行)
+ EXECUTEを使ってUPD_SQLを実行
 sakura=# EXECUTE UPD_SQL(1,'さくら');
 UPDATE 1
 sakura=# EXECUTE UPD_SQL(2,'つばき');
 UPDATE 1
 sakura=# EXECUTE UPD_SQL(3,'すずらん');
 UPDATE 1
+ 上記で実行したUPD_SQLでデータがインサートされているかを確認
 sakura=# SELECT * FROM foo;
  a |    b     
 ---+----------
  1 | さくら
  2 | つばき
  3 | すずらん
 (3 行)

上記で操作したSQLを添付しておきます。
#ref(prepare02.sql)

以下のようにすれば端末から実行できます。
 psql < prepare02.sql
実行結果
 $ psql < prepare02.sql 
 DROP TABLE
 CREATE TABLE
 INSERT 0 1
  a |   b    
 ---+--------
  1 | sakura
 (1 行)
 
 PREPARE
 PREPARE
 INSERT 0 1
 INSERT 0 1
  a |    b    
 ---+---------
  1 | sakura
  2 | tsubaki
  3 | suzuran
 (3 行)
 
 UPDATE 1
 UPDATE 1
 UPDATE 1
  a |    b     
 ---+----------
  1 | さくら
  2 | つばき
  3 | すずらん
 (3 行)

#htmlinsertpcsp(db-btm.html,db-sp.html)

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