★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

33.3. SQLコマンドの実行

すべてのSQLコマンドは、埋め込みSQLアプリケーション内で実行できます。 以下に例をいくつか示します。

33.3.1. 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 を用いて直接実行することができます。複数の行を扱うためには、アプリケーションはカーソルを使わなければなりません; 項33.3.2 を参照してください。 (特殊なケースでは、アプリケーションは複数の行をホスト変数の配列に一度に読み込むことができます; 項33.4.4.3.1 を参照してください)

単一行の検索:

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

同様に、設定パラメータは SHOW コマンドによって取得することができます:

EXEC SQL SHOW search_path INTO :var;

:somethingという形のトークンはホスト変数です。 つまり、Cプログラム内の変数を参照するものです。 これについては項33.4で説明します。

33.3.2. カーソルの使用

複数行の結果セットを受け取るためには、アプリケーションはカーソルを定義し、必要に応じてレコードを一行ずつ取り込む必要があります。カーソルを使った処理は、カーソ ルの宣言、カーソルのオープン、カーソルからの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コマンドで宣言された)カーソルが開かれます。

33.3.3. トランザクションの管理

デフォルトモードでは、SQL文はEXEC SQL COMMITが発行されることによってのみコミットされます。 埋め込みSQLインタフェースでも、ecpgコマンド(以下を参照)の-tコマンドラインオプション、あるいは EXEC SQL SET AUTOCOMMIT TO ON文によって(libpqの振舞いに似た)トランザクションの自動コミットをサポートしています。 自動コミットモードでは、問い合わせが明示的なトランザクションブロックの内部にある場合を除き、すべての問い合わせが自動的にコミットされます。 自動コミットモードは、EXEC SQL SET AUTOCOMMIT TO OFFを使用して明示的に無効にすることができます。

以下のトランザクション管理コマンドを使用することができます:

EXEC SQL COMMIT

実行中のトランザクションのコミット。

EXEC SQL ROLLBACK

実行中のトランザクションのロールバック。

EXEC SQL SET AUTOCOMMIT TO ON

自動コミットモードの有効化。

SET AUTOCOMMIT TO OFF

自動コミットモードの無効化。デフォルト状態。

33.3.4. Prepared Statements

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;

/* when end of result set reached, break out of while loop */
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 を参照してください。 また、プレースホルダと入力パラメータの利用についての詳細は 項33.5 を参照してください。