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”を参照してください。