ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

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()で同じプリペアドステートメントの名前をループ内で使うための対処として、利用しています。

f:id:AJYA:20180612122928p:plain
unsplash-logorawpixel

同じメジャーバージョンでも利用できない場合あり

同じプリペアドステートメントの名前をループ内で使う場合に使えるのかと思って、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を思い出せなくても、コードを考えて対処していそうです。