PostgreSQL:DEALLOCATEを使う場面と互換性
PostgreSQLで、DEALLOCATEという見慣れないコマンドが使われているのソースコードを見ました。
DEALLOCATE
どんな場合に使っているかというと、
$params = array("Joe's Widgets", "Clothes Clothes Clothes"); $dbconn = pg_connect("dbname=mary"); for ($i = 0; $i < 2; $i++) { $result = pg_query($dbconn, "DEALLOCATE ALL"); $result = pg_prepare($dbconn, "my_query", "SELECT * FROM shops WHERE name = $1"); $result = pg_execute($dbconn, "my_query", array($params[$i])); }
というように、ループ内でpg_prepare()を利用している場合に使っていました。
この場合、pg_prepare()で同じプリペアドステートメントの名前をループ内で使うための対処として、利用しています。
同じメジャーバージョンでも利用できない場合あり
同じプリペアドステートメントの名前をループ内で使う場合に使えるのかと思って、PostgreSQL 8.2で使ってみると、エラーが発生します。
マニュアルを見ると、PostgreSQL 8.2ではALLがなくて、PostgreSQL 8.3からALLが追加されていました。
PostgreSQL 8.2.6-DEALLOCATE
PostgreSQL 8.3.7-DEALLOCATE
上のソースコードの場合、
$params = array("Joe's Widgets", "Clothes Clothes Clothes"); $dbconn = pg_connect("dbname=mary"); $result = pg_prepare($dbconn, "my_query", "SELECT * FROM shops WHERE name = $1"); for ($i = 0; $i < 2; $i++) { $result = pg_execute($dbconn, "my_query", array($params[$i])); }
このようにループの外にpg_prepare()を移動していまえばDEALLOCATEは不要になります。
どのような場面でDEALLOCATEがないと困るのか理解ができていません。
DEALLOCATEを思い出せなくても、コードを考えて対処していそうです。