バージョンごとのドキュメント一覧

36.3. SQLコマンドの実行 #

<title>Running SQL Commands</title>

Any SQL command can be run from within an embedded SQL application. Below are some examples of how to do that. すべてのSQLコマンドは、埋め込みSQLアプリケーション内で実行できます。 以下に例をいくつか示します。

36.3.1. SQL文の実行 #

<title>Executing SQL Statements</title>

Creating a table: テーブルの作成:

EXEC SQL CREATE TABLE foo (number integer, ascii char(16));
EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number);
EXEC SQL COMMIT;

Inserting rows: 行の挿入:

EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad');
EXEC SQL COMMIT;

Deleting rows: 行の削除:

EXEC SQL DELETE FROM foo WHERE number = 9999;
EXEC SQL COMMIT;

Updates: 行の更新:

EXEC SQL UPDATE foo
    SET ascii = 'foobar'
    WHERE number = 9999;
EXEC SQL COMMIT;

<literal>SELECT</literal> statements that return a single result row can also be executed using <literal>EXEC SQL</literal> directly. To handle result sets with multiple rows, an application has to use a cursor; see <xref linkend="ecpg-cursors"/> below. (As a special case, an application can fetch multiple rows at once into an array host variable; see <xref linkend="ecpg-variables-arrays"/>.) 単一の行を返すSELECT文は、同様に EXEC SQL を用いて直接実行することができます。複数の行を扱うためには、アプリケーションはカーソルを使わなければなりません; 36.3.2 を参照してください。 (特殊なケースでは、アプリケーションは複数の行をホスト変数の配列に一度に読み込むことができます; 36.4.4.3.1 を参照してください)

Single-row select: 単一行の検索:

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

Also, a configuration parameter can be retrieved with the <literal>SHOW</literal> command: 同様に、設定パラメータは SHOW コマンドによって取得することができます:

EXEC SQL SHOW search_path INTO :var;

The tokens of the form <literal>:<replaceable>something</replaceable></literal> are <firstterm>host variables</firstterm>, that is, they refer to variables in the C program. They are explained in <xref linkend="ecpg-variables"/>. :somethingという形のトークンはホスト変数です。 つまり、Cプログラム内の変数を参照するものです。 これについては36.4で説明します。

36.3.2. カーソルの使用 #

<title>Using Cursors</title>

To retrieve a result set holding multiple rows, an application has to declare a cursor and fetch each row from the cursor. The steps to use a cursor are the following: declare a cursor, open it, fetch a row from the cursor, repeat, and finally close it. 複数行の結果セットを受け取るためには、アプリケーションはカーソルを定義し、必要に応じてレコードを一行ずつ取り込む必要があります。カーソルを使った処理は、カーソルの宣言、カーソルのオープン、カーソルからのFETCH、カーソルのクローズという流れになります。

Select using cursors: カーソルを用いた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;

For more details about declaring a cursor, see <xref linkend="ecpg-sql-declare"/>; for more details about fetching rows from a cursor, see <xref linkend="sql-fetch"/>. カーソルの宣言の詳細についてはDECLAREを参照してください。カーソルから行を取り出す詳細についてはFETCHを参照してください。

注記

The ECPG <command>DECLARE</command> command does not actually cause a statement to be sent to the PostgreSQL backend. The cursor is opened in the backend (using the backend's <command>DECLARE</command> command) at the point when the <command>OPEN</command> command is executed. ECPGの DECLARE コマンド自身は、PostgreSQLバックエンドに送られるSQL文を実行しません。OPEN コマンドが実行された段階で、バックエンド内部で(DECLAREコマンドで宣言された)カーソルが開かれます。

36.3.3. トランザクションの管理 #

<title>Managing Transactions</title>

In the default mode, statements are committed only when <command>EXEC SQL COMMIT</command> is issued. The embedded SQL interface also supports autocommit of transactions (similar to <application>psql</application>'s default behavior) via the <option>-t</option> command-line option to <command>ecpg</command> (see <xref linkend="app-ecpg"/>) or via the <literal>EXEC SQL SET AUTOCOMMIT TO ON</literal> statement. In autocommit mode, each command is automatically committed unless it is inside an explicit transaction block. This mode can be explicitly turned off using <literal>EXEC SQL SET AUTOCOMMIT TO OFF</literal>. デフォルトモードでは、SQL文はEXEC SQL COMMITが発行されることによってのみコミットされます。 埋め込みSQLインタフェースでも、ecpgコマンド(ecpgを参照)の-tコマンドラインオプション、あるいは EXEC SQL SET AUTOCOMMIT TO ON文によって(psqlのデフォルトの振舞いに似た)トランザクションの自動コミットをサポートしています。 自動コミットモードでは、問い合わせが明示的なトランザクションブロックの内部にある場合を除き、すべての問い合わせが自動的にコミットされます。 自動コミットモードは、EXEC SQL SET AUTOCOMMIT TO OFFを使用して明示的に無効にすることができます。

The following transaction management commands are available: 以下のトランザクション管理コマンドを使用することができます:

EXEC SQL COMMIT #

Commit an in-progress transaction. 実行中のトランザクションのコミット。

EXEC SQL ROLLBACK #

Roll back an in-progress transaction. 実行中のトランザクションのロールバック。

EXEC SQL PREPARE TRANSACTION transaction_id #

Prepare the current transaction for two-phase commit. 2相コミット用に現在のトランザクションをプリペアします。

EXEC SQL COMMIT PREPARED transaction_id #

Commit a transaction that is in prepared state. プリペアド状態のトランザクションをコミットします。

EXEC SQL ROLLBACK PREPARED transaction_id #

Roll back a transaction that is in prepared state. プリペアド状態のトランザクションをロールバックします。

EXEC SQL SET AUTOCOMMIT TO ON #

Enable autocommit mode. 自動コミットモードの有効化。

EXEC SQL SET AUTOCOMMIT TO OFF #

Disable autocommit mode. This is the default. 自動コミットモードの無効化。デフォルト状態。

36.3.4. プリペアド文 #

<title>Prepared Statements</title>

When the values to be passed to an SQL statement are not known at compile time, or the same statement is going to be used many times, then prepared statements can be useful. SQL文に渡す値がコンパイル時に決まらない場合、または同じSQL文を何度も実行する場合、プリペアド文が便利です。

The statement is prepared using the command <literal>PREPARE</literal>. For the values that are not known yet, use the placeholder <quote><literal>?</literal></quote>: SQL文はPREPAREコマンドを使ってプリペアします。 まだ決まっていない値については、プレースホルダ ? を使います:

EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";

If a statement returns a single row, the application can call <literal>EXECUTE</literal> after <literal>PREPARE</literal> to execute the statement, supplying the actual values for the placeholders with a <literal>USING</literal> clause: SQL文が一行のみの結果を返却する場合には、アプリケーションはSQL文をPREPAREした後、USINGを用いてプレースホルダに実際の値を与えてEXECUTEを実行することができます。

EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;

If a statement returns multiple rows, the application can use a cursor declared based on the prepared statement. To bind input parameters, the cursor must be opened with a <literal>USING</literal> clause: 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 */

/* 結果集合の最後に到達したら、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;

When you don't need the prepared statement anymore, you should deallocate it: プリペアド文をこれ以上必要としなくなったら、解放処理をしなければなりません:

EXEC SQL DEALLOCATE PREPARE name;

For more details about <literal>PREPARE</literal>, see <xref linkend="ecpg-sql-prepare"/>. Also see <xref linkend="ecpg-dynamic"/> for more details about using placeholders and input parameters. PREPARE についての詳細は PREPARE を参照してください。 また、プレースホルダと入力パラメータの利用についての詳細は 36.5 を参照してください。