SQLコマンドの実行

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 33章ECPG - C言語による埋め込みSQL | 早送り | 次のページ

# 33.3. SQLコマンドの実行

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

## 33.3.1. Executing SQL Statements

テーブルの作成:

    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. Using Cursors

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

前のページ | ホーム | 次のページ
データベース接続の管理 | 上に戻る | ホスト変数の使用