ページの先頭行へ戻る
Enterprise Postgres 12 アプリケーション開発ガイド
FUJITSU Software

D.3.4 Prepared Statements

SQL文に渡す値がコンパイル時に決まらない場合、または同じSQL文を何度も実行する場合、プリペアード・ステートメントが便利です。

SQL文は、PREPAREコマンドを使ってプリペアします。まだ決まっていない値については、プレースホルダ "?" を使います:

EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?" END-EXEC.

SQL文が一行のみの結果を返却する場合には、アプリケーションはSQL文を PREPARE した後、USING を用いてプレースホルダに実際の値を与えて EXECUTE を実行することができます。

EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1 END-EXEC.

SQL文が複数の行を返却する場合には、アプリケーションはプリペアード・ステートメントの宣言に対応したカーソルを利用することができます。 入力パラメータを設定するために、カーソルは USING とともに開かれなければなりません:

EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?" END-EXEC.
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1 END-EXEC.
* when end of result set reached, break out of while loop
EXEC SQL WHENEVER NOT FOUND GOTO FETCH-END END-EXEC.
EXEC SQL OPEN foo_bar USING 100 END-EXEC.
...
PERFORM NO LIMIT
    EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname END-EXEC
END-PERFORM.

FETCH-END.
EXEC SQL CLOSE foo_bar END-EXEC.

プリペアード・ステートメントをこれ以上必要としなくなったら、解放処理をしなければなりません:

EXEC SQL DEALLOCATE PREPARE name END-EXEC.

PREPARE についての詳細は“D.11.10 PREPARE”を参照してください。 また、プレースホルダと入力パラメータの利用についての詳細は “D.5 動的SQL”を参照してください。