Any SQL command can be run from within an embedded SQL application. Below are some examples of how to do that. すべてのSQLコマンドは、埋め込みSQLアプリケーション内で実行できます。 以下に例をいくつか示します。
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
を用いて直接実行することができます。複数の行を扱うためには、アプリケーションはカーソルを使わなければなりません; 34.3.2 を参照してください。
(特殊なケースでは、アプリケーションは複数の行をホスト変数の配列に一度に読み込むことができます; 34.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"/>.
:
という形のトークンはホスト変数です。
つまり、Cプログラム内の変数を参照するものです。
これについては34.4で説明します。
something
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
コマンドで宣言された)カーソルが開かれます。
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. 自動コミットモードの無効化。デフォルト状態。
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 を参照してください。
また、プレースホルダと入力パラメータの利用についての詳細は 34.5 を参照してください。