すべてのSQLコマンドは、埋め込みSQLアプリケーション内で実行できます。 以下に例をいくつか示します。
テーブルの作成:
EXEC SQL CREATE TABLE foo (number integer, ascii char(16)); EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number); EXEC SQL COMMIT;
行の挿入:
EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad'); EXEC SQL COMMIT;
行の削除:
EXEC SQL DELETE FROM foo WHERE number = 9999; EXEC SQL COMMIT;
行の更新:
EXEC SQL UPDATE foo SET ascii = 'foobar' WHERE number = 9999; EXEC SQL COMMIT;
単一の行を返すSELECT
文は、同様に EXEC SQL
を用いて直接実行することができます。複数の行を扱うためには、アプリケーションはカーソルを使わなければなりません; 35.3.2 を参照してください。
(特殊なケースでは、アプリケーションは複数の行をホスト変数の配列に一度に読み込むことができます; 35.4.4.3.1 を参照してください)
単一行の検索:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
同様に、設定パラメータは SHOW
コマンドによって取得することができます:
EXEC SQL SHOW search_path INTO :var;
:
という形のトークンはホスト変数です。
つまり、Cプログラム内の変数を参照するものです。
これについては35.4で説明します。
something
複数行の結果セットを受け取るためには、アプリケーションはカーソルを定義し、必要に応じてレコードを一行ずつ取り込む必要があります。カーソルを使った処理は、カーソルの宣言、カーソルのオープン、カーソルからのFETCH、カーソルのクローズという流れになります。
カーソルを用いたSELECT:
EXEC SQL DECLARE foo_bar CURSOR FOR SELECT number, ascii FROM foo ORDER BY ascii; EXEC SQL OPEN foo_bar; EXEC SQL FETCH foo_bar INTO :FooBar, DooDad; ... EXEC SQL CLOSE foo_bar; EXEC SQL COMMIT;
カーソルの宣言の詳細については DECLARE を、FETCH
コマンドの詳細については FETCH を参照してください。
ECPGの DECLARE
コマンド自身は、PostgreSQLバックエンドに送られるSQL文を実行しません。OPEN
コマンドが実行された段階で、バックエンド内部で(DECLARE
コマンドで宣言された)カーソルが開かれます。
デフォルトモードでは、SQL文はEXEC SQL COMMIT
が発行されることによってのみコミットされます。
埋め込みSQLインタフェースでも、ecpg
コマンド(以下を参照)の-t
コマンドラインオプション、あるいは EXEC SQL SET AUTOCOMMIT TO ON
文によって(psqlのデフォルトの振舞いに似た)トランザクションの自動コミットをサポートしています。
自動コミットモードでは、問い合わせが明示的なトランザクションブロックの内部にある場合を除き、すべての問い合わせが自動的にコミットされます。
自動コミットモードは、EXEC SQL SET AUTOCOMMIT TO OFF
を使用して明示的に無効にすることができます。
以下のトランザクション管理コマンドを使用することができます:
EXEC SQL COMMIT
実行中のトランザクションのコミット。
EXEC SQL ROLLBACK
実行中のトランザクションのロールバック。
EXEC SQL PREPARE TRANSACTION
transaction_id
2相コミット用に現在のトランザクションをプリペアします。
EXEC SQL COMMIT PREPARED
transaction_id
プリペアド状態のトランザクションをコミットします。
EXEC SQL ROLLBACK PREPARED
transaction_id
プリペアド状態のトランザクションをロールバックします。
EXEC SQL SET AUTOCOMMIT TO ON
自動コミットモードの有効化。
EXEC SQL SET AUTOCOMMIT TO OFF
自動コミットモードの無効化。デフォルト状態。
SQL文に渡す値がコンパイル時に決まらない場合、または同じSQL文を何度も実行する場合、プリペアド文が便利です。
SQL文はPREPARE
コマンドを使ってプリペアします。
まだ決まっていない値については、プレースホルダ 「?
」 を使います:
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
SQL文が一行のみの結果を返却する場合には、アプリケーションはSQL文をPREPARE
した後、USING
を用いてプレースホルダに実際の値を与えてEXECUTE
を実行することができます。
EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;
SQL文が複数の行を返却する場合には、アプリケーションはプリペアド文の宣言に対応したカーソルを利用することができます。
入力パラメータを設定するために、カーソルはUSING
とともに開かれなければなりません:
EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?"; EXEC SQL DECLARE foo_bar CURSOR FOR stmt1; /* 結果集合の最後に到達したら、whileループから抜ける */ EXEC SQL WHENEVER NOT FOUND DO BREAK; EXEC SQL OPEN foo_bar USING 100; ... while (1) { EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname; ... } EXEC SQL CLOSE foo_bar;
プリペアド文をこれ以上必要としなくなったら、解放処理をしなければなりません:
EXEC SQL DEALLOCATE PREPARE name
;
PREPARE
についての詳細は PREPARE を参照してください。
また、プレースホルダと入力パラメータの利用についての詳細は 35.5 を参照してください。