英語マニュアル
7 参照
7.5.2 呼び出し
7.5.3 閉じる
7.5.4 コミット
7.5.5 CONNECT
7.5.9 DECLARE文
7.5.10 削除
7.5.11 DESCRIBE
7.5.13 切断
7.5.14 EXECUTE
7.5.18 FETCH
7.5.21 挿入
7.5.22 OPEN
7.5.23 オープン記述子
7.5.24 PREPARE
7.5.25 ROLLBACK
7.5.26 SAVEPOINT
7.5.27 SELECT
7.5.30 更新
7.5.31 WHENEVER
•
Oracleデータベースと互換性のある CALLステートメント。
ECPGPlusのPro * C互換性の一部として、 BEGIN DECLARE SECTIONおよびEND DECLARE SECTIONディレクティブを含める必要はありません 。
ほとんどのECPGPlusステートメントはコミュニティPostgreSQLで機能しますが、 CALLステートメントとEXECUTE … END EXECステートメントは、クライアントアプリケーションがEDB Postgres Advanced Serverに接続されている場合にのみ機能します。
以下の説明では、 用語は、言語キーワード、ユーザー指定の値、リテラルなどの単語または単語のグループを指します。用語の正確な意味は、使用されるコンテキストによって異なります。
•
斜体フォント は、通常、初めて定義する文に新しい用語を導入します。
•
Fixed-width (mono-spaced) font は、 SQL ステートメント、例で使用される特定のテーブルおよび列名、プログラミング言語のキーワード など、文字どおりに指定する必要がある用語に使用され ます 。たとえば、 SELECT * FROM emp;
•
Italic fixed-width font は、ユーザーが実際の使用で値を置き換える必要がある用語に使用されます。たとえば、 DELETE FROM table_name ;
•
角括弧[]は、囲まれた用語の1つを置換することも、まったく置換しないこともあります。たとえば、 [ a | b ] 、「 a 」または「 b 」のいずれか、または2つのどちらも選択しないことを意味します。
•
中括弧{}は、囲まれた選択肢の1つを指定する必要があることを示します。たとえば、 { a | b } 、「 a 」または「 b 」のいずれかを指定する必要があることを意味します。
•
省略記号...は、前の用語が繰り返される可能性があることを示します。たとえば、 [ a | b ] ...は、「 baaba 」というシーケンスがあることを意味します。
ecpg_path
埋め込みSQL文を含むCプログラムから実行可能ファイルを生成するために、プログラム(通過 my_program.pgc ECPGPlusプリコンパイラに上記図中に)。 ECPGPlusは、各SQL文の翻訳my_program.pgc呼び出すCコードにecpglib APIを、そしてCプログラム(生成my_program.c )。次に、CプログラムをCコンパイラに渡します。 Cコンパイラはオブジェクトファイル( my_program.o )を生成します。最後に、オブジェクトファイル( my_program.o )、 ecpglibライブラリファイル、およびその他の必要なライブラリをリンカーにmy_program 、リンカーが実行可能ファイル( my_program )を生成します。
ECPGPlusプリプロセッサは各SQLステートメントの構文を検証し ますが、 セマンティクスを検証することはできません。たとえば、プリプロセッサはINSERTステートメントが構文的に正しいことを確認しますが、 INSERTステートメントで言及されたテーブルが実際に存在することは確認できません。
•
3
7
9 {
15
20
Cプリプロセッサディレクティブは、解釈または無視されます。このオプションは、 ECPGPlusを起動するときに入力されるコマンドラインオプション( -C PROC ) によって制御されます 。どちらの場合でも、ECPGPlusは各Cプリプロセッサディレクティブを変更せずに出力ファイル(4)にコピーします。ソースファイルで見つかったCプリプロセッサディレクティブは、出力ファイルに表示されます。
•
行10〜14には、埋め込みSQL宣言セクションが含まれています。

SQLコード内で参照するC変数は、
ホスト変数と 呼ばれ ます 。 Pro * Cモード( -C PROC )でECPGPlusプリプロセッサを呼び出す場合、SQLステートメント内の任意の C変数を参照できます。それ以外の場合は、 BEGIN/END DECLARATION SECTIONペア内で各ホスト変数を宣言する必要があります。
SQLステートメントには EXEC SQLをプレフィックスとして付け 、次の(引用符で囲まれていない)セミコロンまで拡張する必要があります 。例えば:
プリプロセッサは上記のコードフラグメントを検出すると、Cコード(最初の行と最後の行)を変換せずに出力ファイルに渡し、各 EXEC SQLステートメントをecpglib関数の呼び出しにecpglibます。結果は次のようになります。
{
}
{
}
Windowsでは、ECPGPlusはAdvanced Serverインストールウィザードによって Database Serverコンポーネントの一部としてインストールされます。 Linuxでは、使ってインストールedb-as xx -server-devel RPMパッケージxx Advanced Serverのバージョン番号です。デフォルトでは、 Linuxインストールでは、実行可能ファイルは次の場所にあります。
ECPGPlusコンパイラを呼び出す場合、実行可能ファイルは検索パス (%PATH% Windowsでは (%PATH% 、Linuxでは $PATH ) に存在する必要があります 。たとえば、次のコマンドは、ECPGPlus実行可能ファイル ecpg を保持するディレクトリを含むように検索パスを設定します 。
set EDB_PATH=C:\Program Files\edb\as11\bin
set PATH=%EDB_PATH%;%PATH%
export EDB_PATH==/usr/edb/as11/bin
export PATH=$EDB_PATH:$PATH
makefile 言う命令のセットが含ま make CプログラムにC(つまり、組み込みSQLが含まれている)で書かれたプログラムを変換する方法ユーティリティを。このガイドの例を試すには、次のものが必要です。
•
make 効用
•
makefile ECPGPlusするための手順が含まれています
次のコードは、 このガイドに含まれているサンプルの makefile 例です 。サンプルコードを使用するに は、ソースコードファイルを含むディレクトリの makefile という名前の makefile に 保存し ます。
最初の2行は pg_configプログラムを使用して、必要なヘッダーファイルとライブラリディレクトリを見つけます。
pg_configプログラムは、Advanced Serverに同梱されています。
make は、Cコンパイラを実行するときに CFLAGS 変数 を使用し 、リンカーを呼び出すときに LDFLAGS および LDLIBS を使用する必要があること make 認識して います。 ECPGプログラムは、ECPGランタイムライブラリ( -lecpg )およびlibpqライブラリ( -lpq )に リンクする必要があります
サンプルの makefile 、 .pgc または .pc ファイルをCプログラム に変換 make 方法を makefile 指示し ます。 makefile 2行は、 ソースファイルがコンパイルされるモードを指定します。最初のコンパイルオプションは次のとおりです。
最初のオプションは 、コミュニティECPG(ECPGPlus拡張なし)を使用して、 .pgcで終わるファイル(おそらく、ECPGソースファイル)を.c (Cプログラム)で終わるファイルに変換make方法を指示します。 INCLUDES変数の値と.pgcファイルの名前を使用して、 -cフラグ(SQLコードをCに変換するようコンパイラーに指示します)を指定してECPGプリコンパイラーを呼び出します。
2番目のオプションは 、ECPGPlus拡張子を使用して、 .pg (ECPGソースファイル)で終わるファイルを.c (Cプログラム)で終わるファイルに変換make方法をmake 指示します。 -cフラグ(SQLコードをCに変換するようコンパイラーに指示する)と-C PROCフラグ(Pro * C互換モードでECPGPlusを使用するようコンパイラーに指示する)でECPGプリコンパイラーを呼び出します。 INCLUDES変数の値と.pgcファイルの名前。
make を実行 make ときに 、コンパイルするECPGソースコードファイルの名前を渡します。たとえば、 customer_list.pgcという名前のECPGソースコードファイルをコンパイルするには、次のコマンドを使用します。
makeユーティリティは、相談 makefileことを発見し、(現在のディレクトリにある)をmakefileコンパイルするルールが含まれcustomer_list.pgc Cプログラム(にcustomer_list.c )し、その後に組み込まれたルール使用するmakeコンパイルするcustomer_list.c実行可能プログラムに。
上記のサンプル makefileは、ECPGPlusをPro * C互換モードで起動するように指定するmakeに、ECPGPlusを起動するときにmakeに-Cオプションmake含まれています。
コマンドラインにECPG構文に加えて-C PROCキーワードを含める場合 、Pro * Cコマンドライン構文を使用できます。例えば:
-c
-C mode
-C option to specify a compatibility mode: Use the option to specify a compatibility mode:
INFORMIX _ SE
-D symbol
The -D keyword PROC mode. is not supported when compiling in PROC mode. Instead, use the Oracle-style 'DEFINE=' clause use the Oracle-style .
-h
-i
Search directory for include files.
-o outfile
-r option
no_indicator - Do not use indicators, but instead use special values to represent NULL values.
prepare - Prepare all statements before using them.
questionmarks - Allow use of a question mark as a placeholder.
usebulk - Enable bulk processing for INSERT, UPDATE and DELETE statements that operate on host variable arrays.
-t
of transactions. autocommit of transactions. Turn on of transactions.
-l
#line directives. Disable directives.
注:ECPGPlusを呼び出すときに出力ファイル名を指定しない場合、出力ファイル名は、 .pgcファイル名拡張子を.pgc 、ファイル名に.cを追加することによって作成されます。
最初のコードサンプルは、 SELECTステートメント(単一の行を返す) を実行し、ホスト変数のグループに結果を保存する方法を示しています。ホスト変数を宣言した後、ハードコードされたロール名と関連するパスワードを使用してedbサンプルデータベースに接続し、 empテーブルを照会します。クエリは、宣言されたホスト変数に値を返します。 NULLインジケータ変数の値を確認した後、簡単な結果セットを画面に出力し、接続を閉じます。
*
*/
{
emp
}
コードサンプルは、C stdio ライブラリ のプロトタイプと型定義を含めることから始まり 、次に main 関数を 宣言し ます。
{
PROCモードでコードをプリコンパイルする予定がある場合は、 BEGIN DECLARE…END DECLAREセクションを省略できます。 ホスト変数の宣言の詳細については、 セクション3.1.2 、 宣言を 参照してください ホスト 変数 。
宣言セクション内の各変数に関連付けられているデータ型は、Cデータ型です。 サーバーとクライアントアプリケーションの間で渡されるデータは、互換性のあるデータ型を共有する必要があります。データ型の詳細については、 セクション7.2 、 サポートを 参照してください C データ タイプ 。
クライアントアプリケーションがSQLコードでエラーを検出した場合、サーバーは sqlprint 提供される sqlprint () 関数を使用して、エラーメッセージを標準エラー(標準エラー) に stderr し ecpglib 。次のEXEC SQLステートメントは、Advanced Serverとの接続を確立します。
この例では、クライアントアプリケーションは 、パスワードが 1safepwd alice というロールを使用 して edb データベースに 接続し ます 。
emp
SELECT 文が使用 INTO 取得された値を(から割り当てる句 empno 、 ename 、 sal と comm にカラム) :v_empno 、 :v_ename 、 :v_sal と :v_comm ホスト変数(と :v_comm_ind ヌルインジケータ)。取得された最初の 値は INTO 句に リストされた最初の変数に 割り当てられ、2番目の値は2番目の変数に割り当てられます。
comm 列には、従業員が獲得したコミッション値が含まれており、潜在的に含まれている可能性が NULL 値を。このステートメントには、 INDICATOR キーワードと、NULLインジケーターを保持するホスト変数が含まれています。
nullインジケータが 0 (つまり false )の場合、 comm 列には意味のある値が含まれ、 printf 関数はコミッションを表示します。 nullインジケータにゼロ以外の値が含まれる場合、 comm は NULL であり、 printf は NULL の値を表示し NULL 。ホスト変数にNULLをフェッチすると、ホスト変数(NULLインジケーター以外)には意味のある値が含まれないことに注意してください 。 NULL可能性がある値を識別するには、NULLインジケータを使用する必要がありNULL 。
}
前の例には インジケーターが 含まれていました comm 列の 値 (サーバーから返されたとき)が NULL であった行を識別する 変数 。標識変数は、先行する変数の内容が NULL か切り捨てられているか を示す追加のホスト変数です 。インジケータ変数は、行の内容が保存されるときに入力されます。インジケータ変数には、次の値が含まれる場合があります。
The value returned by the server was not NULL , and was not truncated.
INTO 句に インジケータ変数 を含める場合、オプションの INDICATOR キーワード を含める必要はありません 。
クエリが 対応するホスト変数に NULL 値を NULL ないことが確実な場合は、インジケータ変数を省略でき ます。インジケータ変数を省略し、クエリが NULL 値を 返す 場合、 ecpglib は実行時エラーを発生させます。
SQLステートメントでホスト 変数 を使用できるのは、そのステートメント内で値が表示される可能性のある任意の時点です。ホスト変数は、クライアントアプリケーションからサーバーにデータ値を渡し、サーバーからクライアントアプリケーションにデータを返すために使用できるC変数です。ホスト変数には次のものがあります。
•
•
typedef
•
struct
でコンパイルされたコードでのホスト変数を使用して実際に示しますコードフラグメント PROCモード、および非でPROCモード。 SQLステートメントは、 deptテーブルに行を追加し、変数v_deptno 、 v_dnameおよびv_locによって返された値をそれぞれdeptno列、 dname列およびloc列に挿入します。
PROCモードでコンパイルする場合は、 EXEC SQL BEGIN DECLARE SECTIONおよびEXEC SQL END DECLARE SECTIONディレクティブを省略できます。 PROCモードでは、C関数パラメーターをホスト変数として使用できます。
PROCモードでコンパイルしない場合は 、次に示すように、 EXEC SQL BEGIN DECLARE SECTIONおよびEXEC SQL END DECLARE SECTIONディレクティブで埋め込み変数宣言をラップする必要があります。
ホスト変数を使用して情報を取得するために、 SELECTステートメントにINTO句を含めることもできます。
SELECTステートメントによって返される各列には、 INTO句に型互換のターゲット変数が必要です。これは、単一の行を取得する簡単な例です。複数の行を取得するには、次の例に示すように、カーソルを定義する必要があります。
1。
使用 DECLARE CURSORカーソルを定義するステートメントを。
2。
OPEN 使用します CURSOR を開く CURSOR ステートメント。
3。
使用 FETCH カーソルからデータを取得する声明を。
4。
CLOSE 使用 CURSOR を閉じる CURSOR ステートメント。
ホスト変数を宣言した後、この例では 、ユーザー指定のロール名とパスワードを使用して edbデータベースに接続し 、 empテーブルを照会します。クエリは、employeesという名前のカーソルに値を返します。次に、サンプルコードはカーソルを開き、結果セットを一度に1行ずつループして結果セットを出力します。サンプルは結果セットの終わりを検出すると、接続を閉じます。
*
*/
{
{
:v_empno, :v_ename, :v_sal, :v_comm INDICATOR :v_comm_ind;
}
}
コードサンプルは、C stdio ライブラリ のプロトタイプと型定義を含めることから始まり 、次に main 関数を 宣言し ます。
{
argv[]は、ユーザーがクライアントアプリケーションを実行するときに入力したコマンドライン引数を含む配列です。 argv[1]には最初のコマンドライン引数(この場合はusername )が含まれ、 argv[2]には2番目のコマンドライン引数( password )が含まれpassword 。通常、実際のアプリケーションに含めるエラーチェックコードは省略されていることに注意してください。宣言は、 usernameとpassword値を初期化し、ユーザーがクライアントアプリケーションを呼び出したときに入力した値に設定します。
(各変数の個別のコピーを作成する代わりに)SQLステートメントで argv[1] と argv[2] を 参照できると考えているかもしれません 。それは動作しません。すべてのホスト変数は、 BEGIN/END DECLARE SECTION 内で宣言する必要があります ( PROC モードで コンパイルしている場合を除く )。以来 argv 関数の パラメータ (ない自動変数) であり 、それは内で宣言することができない BEGIN/END DECLARE SECTION 。 PROC モードで コンパイルしている場合 、SQLステートメント内の 任意の C変数を 参照でき ます。
CONNECTステートメントはへの接続を作成edbで見つかった値使用して、データベースの:usernameと:password接続時にサーバにアプリケーションを認証するために、ホスト変数を。
employeesは、 empテーブルのSELECTステートメントの結果セットが含まれます。クエリは、従業員情報を次の列から返します: empno 、 ename 、 salおよびcomm 。カーソルを宣言するとき、 INTO句を含めないことに注意してください。代わりに、カーソルからFETCHするときにターゲット変数(または記述子)を指定します。
後続の FETCHセクションでは、クライアントアプリケーションはカーソルの内容をループします。クライアントアプリケーションには、カーソルの最後に達したときにサーバーにbreak (ループの終了)を指示するWHENEVERステートメントが含まれています。
クライアントアプリケーションは、使用して FETCHカーソルから各行を取得するために文をINTO前に宣言ホスト変数:
{
:v_empno, :v_ename, :v_sal, :v_comm INDICATOR :v_comm_ind;
FETCH ステートメントが使用 INTO に取得された値を割り当てる句 :v_empno 、 :v_ename 、 :v_sal と :v_comm ホスト変数(と :v_comm_ind ヌルインジケータ)。カーソルの最初の値は INTO 句に リストされている最初の変数に 割り当てられ、2番目の値は2番目の変数に割り当てられます。
FETCH 文ではまた、 INDICATOR キーワードとヌルインジケータを保持するために、ホスト変数を。 取得したレコード の comm 列に NULL 値 が含まれている 場合、 v_comm_ind はゼロ以外の値に設定され、列が NULL であることを示し NULL 。
}
nullインジケータが 0 (つまり false )の場合、 v_com m には意味のある値が含まれ、 printf 関数は手数料を表示します。 nullインジケータにゼロ以外の値が含まれる場合、 comm は NULL であり、 printf は文字列 ' NULL' 表示します 。ホスト変数にNULLをフェッチすると、ホスト変数(NULLインジケーター以外)には意味のある値が含まれないことに注意してください 。 NULL可能性がある値にはNULLインジケータを使用する必要がありNULL 。
コードサンプルの最後のステートメントは、カーソル( employees )とサーバーへの接続を閉じます。
動的SQLを使用すると、クライアントアプリケーションは、実行時に構成されるSQLステートメントを実行できます。これは、クライアントアプリケーションを記述しているときに内容や形式がわからない場合に便利です。 ECPGPlusでは 、識別子(テーブル名、列名、インデックス名など)の代わりにホスト変数を使用でき ませ ん 。代わりに、動的SQLステートメントを使用して、情報を含む文字列を作成し、その文字列を実行する必要があります。文字列は、 記述子の 形式でクライアントとサーバーの間で渡されます 。記述子は、データとデータの形状に関する情報の両方を含むデータ構造です。
クライアントアプリケーションは GET 使用する必要があります 記述子から情報を取得する DESCRIPTOR ステートメント。次の手順では、動的SQLを使用したクライアントアプリケーションの基本的なフローについて説明します。
1。
ALLOCATE DESCRIPTORステートメントを使用して、結果セット(選択リスト)の記述子を割り当てます。
2。
ALLOCATE DESCRIPTORステートメントを使用して、入力パラメーター(バインド変数)の記述子を割り当てます。
4。
PREPAREステートメントを使用して 、SQLステートメントを解析および構文チェックします。
5。
DESCRIBEステートメントを使用して 、選択リストを選択リスト記述子に記述します。
6。
DESCRIBEステートメントを使用して、バインド変数記述子への入力パラメーターを記述します。
8。
使用 DECLARE CURSOR文のカーソルを定義するステートメントを。
9。
OPEN CURSORステートメントを使用して、ステートメントのカーソルを開きます。
10。
FETCHステートメントを使用して 、カーソルから各行をフェッチし、各行を選択リスト記述子に保存します。
11。
GET DESCRIPTORコマンドを使用して 、選択リスト記述子に問い合わせて、現在の行の各列の値を見つけます。
12。
CLOSE CURSORステートメントを使用して 、カーソルを閉じ、カーソルリソースを解放します。
N/A
TYPE is 9 If :
1 - DATE
2 - TIME
3 - TIMESTAMP
4 - TIME WITH TIMEZONE
5 - TIMESTAMP WITH TIMEZONE
NULL or truncated value. Indicates a or truncated value.
1 - SQL3_CHARACTER
2 - SQL3_NUMERIC
3 - SQL3_DECIMAL
4 - SQL3_INTEGER
5 - SQL3_SMALLINT
6 - SQL3_FLOAT
7 - SQL3_REAL
8 - SQL3_DOUBLE_PRECISION
9 - SQL3_DATE_TIME_TIMESTAMP
10 - SQL3_INTERVAL
12 - SQL3_CHARACTER_VARYING
13 - SQL3_ENUMERATED
14 - SQL3_BIT
15 - SQL3_BIT_VARYING
16 - SQL3_BOOLEAN
•
SQL記述子を使用して SELECTステートメントを実行する方法 。
*
*/
{
{
}
{
{
{
}
}
}
}
{
{
};
{
}
}
コードサンプルは、C stdio および stdlib ライブラリ のプロトタイプと型定義 、SQLデータ型シンボル、およびSQLCA(SQLコミュニケーションエリア)構造 を含めることから始まり stdio 。
アプリケーションには 、記述子で見つかったメタデータを出力する print_meta_data() という名前の関数の前方宣言が含ま れています。
{
アプリケーションは PREPAREステートメントを使用して、ユーザーから提供された文字列を構文チェックします。
クエリのメタデータをSQL記述子に移動する DESCRIBEステートメント。
列数がゼロの場合、エンドユーザーは SELECTステートメントを入力しませんでした 。アプリケーションはEXECUTE IMMEDIATEステートメントを使用して、ステートメントの内容を処理します。
{
}
{
ユーザーが入力したステートメントが SELECT ステートメントである場合(列カウントがゼロ以外であることがわかっているため)、アプリケーションは row という名前の変数を宣言します 。
{
次に、 FETCHを使用して、カーソルから次の行を記述子に取得します。
アプリケーションは、 FETCHが失敗しなかったことを確認します。 FETCHが失敗した場合、アプリケーションは結果セットの最後に到達し、ループを中断します。
{
アプリケーションは、行記述子( row_desc )に問い合わせて 、列値( :val )、nullインジケータ( :ind )および列名( :name )を上記で宣言したホスト変数にコピーします。コンマ区切りリストを使用して、記述子から複数のアイテムを取得できることに注意してください。
NULLインジケータ( ind )が負の場合、列の値はNULLです。 NULLインジケータが0より大きい場合、列の値が長すぎてvalホスト変数に収まりません(したがって、 <truncated> )。それ以外の場合、nullインジケータは0 ( NOT NULL意味する)なので、値を出力します。いずれの場合も、値(または<null>または<truncated> )の前に列の名前を付けます。
}
}
}
}
print_meta_data()関数は、記述子からメタデータを抽出し、名前、データタイプ、および各列の長さを印刷します。
{
次に、アプリケーションは、データ型の値( numeric )をデータ型名にマップする文字列の配列を定義します。記述子で見つかった数値を使用して、この配列にインデックスを付けます。たとえば、特定の列がタイプ2であることがわかった場合、 types[2]記述することでそのタイプの名前( NUMERIC )を見つけることができます。
{
};
アプリケーションは、記述子から列カウントを取得します。プログラムは、記述子の名前を含むホスト変数( desc )を使用して記述子を参照することに注意してください 。ほとんどのシナリオでは、識別子を使用して記述子を参照しますが、この場合、呼び出し元が記述子名を提供したため、ホスト変数を使用して記述子を参照できます。
{
数値型コードが「既知の」型コード(つまり、 types[]配列にある型コード)と一致する場合、 type_nameを対応する型の名前に設定します。そうでない場合、 type_nameを"unknown"設定します。
}
}
•
最初の例は、 SELECTステートメントを含まず、入力変数を必要としないSQLステートメントの処理と実行を示しています。この例は、Oracle Dynamic SQL Method 1で使用される手法に対応しています。
•
2番目の例は、 SELECTステートメントを含まず、既知の数の入力変数を含むSQLステートメントの処理と実行を示しています。この例は、Oracle Dynamic SQL Method 2で使用される手法に対応しています。
•
3番目の例は、 SELECTステートメントを含むことができ 、既知の数の入力変数を含むSQLステートメントの処理と実行を示しています。この例は、Oracle Dynamic SQL Method 3で使用される手法に対応しています。
•
4番目の例は、 SELECTステートメントを含み、入力変数の数が不明なSQLステートメントの処理と実行を示しています。この例は、Oracle Dynamic SQL Method 4で使用される手法に対応しています。
次の例は、 EXECUTE 使用方法を示しています アプリケーションを実行するまで文のテキストがわからないSQL文を実行する IMMEDIATE コマンド。 EXECUTE は使用できません 結果セットを返すステートメントを実行する IMMEDIATE 。 EXECUTE は使用できません パラメータープレースホルダーを含むステートメントを実行する IMMEDIATE 。
EXECUTE IMMEDIATEステートメントは、アプリケーションのパフォーマンスに悪影響を与えることができ、それが実行されるたびに解析し、SQL文を予定しております。同じステートメントを繰り返し実行する場合は、次の例で説明するPREPARE / EXECUTEテクニックの使用を検討してください。
コードサンプルは、Cの stdio 、 string 、および stdlib ライブラリ のプロトタイプと型定義を含めることから始まり 、プログラムの基本的なインフラストラクチャを提供します。
次に、エラーハンドラーを設定します。 ECPGPlusは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。

EXEC SQL CONNECT :argv[1];

次に、プログラムはEXECUTE IMMEDIATEステートメントを使用してSQLステートメントを実行し、 deptテーブルに行を追加します。
場合 EXECUTE IMMEDIATEコマンドが何らかの理由で失敗し、ECPGPlusを呼び出すhandle_error()ユーザにエラーメッセージを表示した後、アプリケーションを終了する)機能。 EXECUTE IMMEDIATEコマンドが成功すると、アプリケーションはユーザーにメッセージ( ok )を表示し、変更をコミットし、サーバーから切断し、アプリケーションを終了します。
ECPGPlusは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。 handle_error()関数は、エラーメッセージの内容を出力し、エラーハンドラをリセットし、変更をロールバックし、データベースから切断し、アプリケーションを終了します。
既知の数のパラメータープレースホルダーを含む非クエリコマンドを実行するには、最初にステートメントをPREPAREし( ステートメントハンドルを提供)、次にステートメントハンドルを使用してステートメントをEXECUTE する必要があり PREPARE 。アプリケーションがステートメントを実行するとき、ステートメントで見つかった各プレースホルダーに値を提供する必要があります。
アプリケーションが PREPARE / EXECUTEメカニズムを使用する場合 、各SQLステートメントは1回解析および計画されますが、何度も実行される可能性があります(毎回異なる値を提供します )。
コードサンプルは、C stdio 、 string 、 stdlib, および sqlca ライブラリ のプロトタイプと型定義を含めることから始まり 、プログラムの基本的なインフラストラクチャを提供し sqlca 。
次に、エラーハンドラーを設定します。 ECPGPlusは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。
次に、プログラムは PREPAREステートメントを使用して、 3つのパラメーターマーカーを含むステートメントを解析および計画しPREPAREステートメントが成功すると、ステートメントの実行に使用できるステートメントハンドルを作成します(この例では、ステートメントハンドルの名前はstmtHandle )。同じステートメントハンドルを使用して、特定のステートメントを複数回実行できます。
ステートメントを解析および計画した後、アプリケーションは EXECUTEステートメントを使用して、ステートメントハンドルに関連付けられたステートメントを実行し、パラメーターマーカーをユーザーが指定した値に置き換えます。
場合は EXECUTEコマンドが何らかの理由で失敗し、ECPGPlusが起動しますhandle_error()ユーザーにエラーメッセージを表示した後、アプリケーションを終了)機能を。 EXECUTEコマンドが成功すると、アプリケーションはユーザーにメッセージ( ok )を表示し、変更をコミットし、サーバーから切断し、アプリケーションを終了します。
ECPGPlusは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。 handle_error()関数は、エラーメッセージの内容を出力し、エラーハンドラをリセットし、変更をロールバックし、データベースから切断し、アプリケーションを終了します。
この例は 、既知の数の入力パラメーターと、結果セット内の既知の数の列を使用して クエリ を実行する方法を示してい ます 。このメソッドは、カーソルを開いて結果セットを反復処理する前に、 PREPAREステートメントを使用してクエリを解析および計画します。
コードサンプルは、C stdio 、 string 、 stdlib, stdbool, および sqlca ライブラリ のプロトタイプと型定義を含めることから始まり 、プログラムの基本的なインフラストラクチャを提供し sqlca 。
次に、エラーハンドラーを設定します。 ECPGPlusは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。
次に、プログラムは PREPAREステートメントを使用して、単一のパラメーターマーカーを含むクエリを解析および計画しますPREPAREステートメントが成功すると、ステートメントの実行に使用できるステートメントハンドルを作成します(この例では、ステートメントハンドルは名前付きstmtHandle )。同じステートメントハンドルを使用して、特定のステートメントを複数回実行できます。
次に、プログラムはカーソル empCursor 宣言して開き 、準備されたSELECTステートメントのパラメーターマーカーにユーザーが指定した値を代入します。ていることに注意してくださいOPEN文が含まれてUSING句を: USING句は、クエリで見つかった各プレースホルダに値を提供する必要があります。
アプリケーションは、 SQLエラーが発生するたびにhandle_error()関数を呼び出します。 handle_error()関数は、エラーメッセージの内容を出力し、エラーハンドラをリセットし、変更をロールバックし、データベースから切断し、アプリケーションを終了します。
次の例は、結果セット内の未知の数の入力パラメーターや列を使用してクエリを実行する方法を示しています。このタイプのクエリは、クエリのテキストの入力をユーザーに要求したとき、またはユーザーがいくつかの条件(フィルターなど)から選択したフォームからクエリを組み立てたときに発生します。
{
}
{
{
{
}
}
}
{
{
{
{
{
}
{
}
{
}
}
}
{
{
}
}
}
}
コードサンプルは、C stdio および stdlib ライブラリ のプロトタイプと型定義を含めることから始まり ます。さらに、プログラムには sqlda.h および sqlcpr.h ヘッダーファイルが 含まれてい ます。 sqlda.h は、この例全体で使用されるSQLDA構造を定義します。 sqlcpr.h は、SQLDA構造で見つかったメタデータを調べるために使用される関数の小さなセットを定義します。
次に、プログラムは2つのSQLDA構造体へのポインターを宣言します。最初のSQLDA構造( params )は、動的クエリテキストで見つかったパラメーターマーカーのメタデータを記述するために使用されます。 2番目のSQLDA構造( results )には、動的クエリの実行によって取得されたメタデータと結果セットの両方が含まれます。
次に、プログラムは3つのホスト変数を宣言します。最初の2つ( usernameとpassword )は、データベースサーバーへの接続に使用されます。 3番目のホスト変数( stmtTxt )は、実行するクエリのテキストを含むNULLで終了するC文字列です。これら3つのホスト変数の値は、コマンドライン引数から派生していることに注意してください。プログラムの実行が開始されると、エラーハンドラが設定され、データベースサーバーに接続されます。
{
次に、プログラムは sqlald()関数を呼び出して、各記述子に必要なメモリを割り当てます。各記述子には、(特に)が含まれます。
SQLDA記述子を割り当てる場合 、結果セットで検索することが予想される列の最大数( SELECTリスト記述子の場合)または動的クエリテキストを検索することが予想されるパラメーターの最大数(バインド変数記述子の場合)を指定します。 -この場合、20列と20パラメーターを超えないことを指定します。また、各列(またはパラメーター)名と各インジケーター変数名の最大長も指定する必要があります。この場合、名前の長さは64バイト以下である必要があります。
SQLDA構造の詳細については、 セクション7.4を参照してください 。
SELECTリストとバインド記述子を割り当てた後 、プログラムは動的ステートメントを準備し、結果セット上にカーソルを宣言します。
次に、プログラムは bindParams()関数を呼び出します。 bindParams()関数はバインド記述子( params )を調べ、動的クエリで見つかった各パラメーターマーカーの代わりに置き換える値をユーザーに求めます。
最後に、プログラムはカーソルを開き(ユーザーが提供するパラメーター値を使用して)、 displayResultSet()関数を呼び出して 、クエリによって生成された結果セットを印刷します。
}
bindParams()関数は、ダイナミッククエリは、任意のパラメータマーカーが含まれているか否かを判断し、各パラメータの値をユーザに促すようにあれば、対応するマーカーにその値を結合します。 DESCRIBE BIND VARIABLEステートメントは、各パラメーターマーカーを記述する情報をparams SQLDA構造に設定します。
{
ステートメントにパラメーターマーカーが含まれない場合、 params->Fには0が含まれます。ステートメントに記述子に収まるよりも多くのパラメーターが含まれる場合、 params->Fには負の数が含まれます(この場合、 params->F絶対値params->Fは、ステートメントで見つかったパラメーターマーカーの数を示します)。 params->Fに正の数が含まれる場合、その数はステートメントで見つかったパラメーターマーカーの数を示します。
{
{
指定されたパラメータの値をユーザに促した後、プログラムを設定することにより、パラメータにその値を結合 params->T[i]値のデータ型を示す(参照、セクション7.3を タイプコードのリストについては)、 params->L[i] 値の長さ( fgets()によって追加された末尾の改行文字を削除するために1 を減算します)、およびNULLで終了するコピーを指すparams->V[i]ユーザーが提供する文字列。
}
}
}
displayResultSet()関数は、結果セット内の各行をループし、各列に求めた値を印刷します。 displayResultSet()は、 DESCRIBE SELECT LISTステートメントを実行することで開始します-このステートメントは、SQLDA記述子( results )に結果セット内の各列の説明を取り込みます。
{
動的ステートメントが列を返さない場合(つまり、動的ステートメントが SELECT ステートメントではない場合)、 results->Fには0が含まれます。ステートメントが記述子に収まるより多くの列を返す場合、 results->Fには負の値が含まれます数値(この場合、 results->F絶対値は、ステートメントによって返される列の数を示します)。 results->Fに正の数が含まれる場合、その数はクエリによって返される列の数を示します。
{
{
sqlnul() results->Tにある型コードをデコードするために、プログラムはsqlnul()関数を呼び出しますsqlnul() SQLDA構造体のTメンバーの説明を参照してくださいsqlnul() セクション7.4 )。このsqlnul()呼び出しは、タイプコードのみを含むようにsqlnul() results->T[col]を変更します( null_permittedフラグはnull_permittedコピーされnull_permitted )。 DESCRIBE SELECT LISTステートメントは、各列の型と各列のNULL値をT配列にエンコードするため、この手順が必要です。
数値の場合( results->T[col] = 2 )、プログラムはsqlprc()関数を呼び出して、列の長さから精度とスケールを抽出します。文字列形式の数値を保持するために必要なバイト数を計算するために、 displayResultSet()は精度(つまり、最大桁数displayResultSet()始まり、符号文字、小数点、およびNULLターミネーターに3バイトを追加します。
{
{
}
{
}
日付または数値以外のタイプの値の場合、 displayResultSet()は、 DESCRIBE SELECT LISTによって報告された最大列幅で始まり、NULLターミネーターに1バイトを追加します。繰り返しますが、実際のアプリケーションでは、他のデータ型に対してより注意深い計算を含めることができます。
{
}
}
特定の列を保持するために必要なスペースの量を計算した後、プログラムは値を保持するのに十分なメモリを割り当て、 results->L[col]を設定してresults->V[col]で見つかったバイト数を示します。列のコード( results->T[col] )を1に入力して、次のFETCHステートメントに値をNULL終了文字列の形式で返すように指示します。
}
{
プログラムは FETCHステートメントを実行して、カーソル内の次の行をresults記述子にフェッチします。 FETCHステートメントが失敗した場合(カーソルが使い果たされたため)、ループの先頭の前にEXEC SQL WHENEVERディレクティブが見つかったため、制御はループの末尾に移動します。
FETCH文では、結果の記述子の以下のメンバーを移入します。
•
*results->I[col]は、列にNULL値( -1 )または非NULL値( 0 )が含まれているかどうかを示します。値がNULLではないが、指定されたスペースに収まるには大きすぎる場合、値は切り捨てられ、 *results->I[col]には正の値が含まれます。
•
results->V[col]には、指定された列に対してフェッチされた値が含まれます( *results->I[col]が列の値がNULLであることを示さunless )。
•
results->L[col]は、指定された列に対してフェッチされた値の長さが含まれます。
最後に、 displayResultSet()は結果セットの各列を反復処理し、対応するNULLインジケーターを調べて、値を出力します。結果セットは整列されません-代わりに、各値はコンマによって前の値から分離されます。
{
}
}
}
}
•
クライアントアプリケーションは、 sqlcaデータ構造のエラーメッセージを調べ、クライアントアプリケーション用にカスタマイズされたエラー処理を提供できます。
•
クライアントアプリケーションには、エラー処理コードを追加するようにECPGPlusコンパイラに指示するEXEC SQL WHENEVERディレクティブをWHENEVER ことができます。
sqlca (SQLコミュニケーションエリア)は、サーバーからクライアントアプリケーションに情報を伝達するためにecpglibによって使用されるグローバル変数です。 SQLステートメント(たとえば、 INSERTまたはSELECTステートメント)を実行した後、 sqlcaの内容を検査して、ステートメントが正常に完了したか、ステートメントが失敗したかを判断できます。
sqlca構造は次のとおりです。
{
{
EXEC SQL INCLUDE sqlca ;
ecpgディレクティブを含める場合 、クライアントアプリケーションのヘッダー宣言にsqlca.hファイルを#includeする必要はありません。
Advanced Serverの sqlca構造には、次のメンバーが含まれています。
sqlcaidにはストリング「 SQLCA"が含まれています。
sqlabcには、 sqlca構造のサイズが含まれていsqlca 。
sqlcodeメンバーは、SQL 92で廃止されました。 Advanced Serverは下位互換性のためにsqlcodeをサポートしていますが、新しいコードを作成するときはsqlstateメンバーを使用する必要があります。
sqlcodeは整数値です。正のsqlcode値は、クライアントアプリケーションが無害な処理条件に遭遇したことを示し、負の値は警告またはエラーを示します。
ステートメントがエラーなしで処理される場合、 sqlcodeには値0が含まれます。クライアントアプリケーションでステートメントの実行中にエラー(または警告)が発生した場合、 sqlcodeには最後に返されたコードが含まれます。
SQL標準では、 100 正の値のみが定義されています。これは、処理された最新のSQLステートメントが行を返さない/影響しないことを示します。標準SQLでは他のsqlcode値を定義していないため、各条件に割り当てられる値はデータベースごとに異なる可能性があることに注意してください。
sqlerrmはsqlca内に埋め込まれた構造で、2つのメンバーで構成されていsqlca 。
sqlerrmlは、現在sqlerrmc格納されているエラーメッセージの長さが含まれます。
sqlerrmcは、 sqlstate格納されたコードに関連付けられたヌル終了メッセージテキストが含まれます。メッセージの長さが149文字を超える場合、 ecpglibはエラーメッセージを切り捨てます。
sqlerrpは、ストリング"NOT SET".が含まれています"NOT SET".
sqlerrdは、6つの要素を含む配列です。
sqlerrd[1]には、処理された行のOIDが含まれます(該当する場合)。
sqlerrd[2]は、処理または返された行の数が含まれます。
sqlerrd[0], sqlerrd[3], sqlerrd[4] 、およびsqlerrd[5]は使用されていません。
sqlwarnは、8文字を含む配列です。
sqlwarn[0]の値が含まれている'W'内の任意の他の元素場合sqlwarnに設定されている' W' 。
データ値がホスト変数に格納されたときに切り捨てられた場合、 sqlwarn[1]には値'W'が含まれます。
クライアントアプリケーションが致命的でない警告を検出した場合、 sqlwarn[2]には値'W'が含まれます。
sqlwarn[3] 、 sqlwarn[4] 、 sqlwarn[5] 、 sqlwarn[6] 、およびsqlwarn[7]は未使用です。
sqlstateは、クライアントアプリケーションからステートメントを実行した後の SQL準拠のステータスコードを含む5文字の配列です。ステートメントがエラーなしで処理される場合、 sqlstateの値は00000ます。 sqlstateはnullで終わる文字列ではないことに注意してください。
sqlstate コードは、階層スキームで割り当てられます。
•
sqlstate の最初の2文字 は、条件の一般的なクラスを示します。
•
sqlstate の最後の3文字は 、クラス内の特定のステータスを示します。
クライアントアプリケーションがSQLステートメントの実行中に複数のエラー(または警告)に遭遇した場合、 sqlstateには最後に返されたコードが含まれます。
次の表は、 sqlstate値とsqlcode値、および関連する条件のシンボル名とエラーの説明を示しています。
-12
07001, or 07002
07001, or 07002
100
EXEC SQL WHENEVERディレクティブを使用して、 ECPGPlusでコンパイルされたクライアントアプリケーションに簡単なエラー処理を実装します。ディレクティブの構文は次のとおりです。
EXEC SQL WHENEVER condition action ;
SQLERROR場合に、条件が存在sqlca.sqlcodeゼロ未満です。
SQLWARNING場合に、条件が存在sqlca.sqlwarn[0]含まれている'W'.
NOT FOUND条件が存在するとき、 sqlca 。 sqlcodeはECPG_NOT_FOUND (クエリがデータを返さない場合)。
CONTINUEを指定して、現在のcondition無視して処理を続行するようクライアントアプリケーションに指示します。 CONTINUEはデフォルトのアクションです。
DO CONTINUE
DO CONTINUE のアクションは 、出力されたCコードでCONTINUEステートメントを生成します。条件に遭遇すると、ループ内の残りのコードをスキップし、次の反復を続行します。ループ内でのみ使用できます。
GOTO label
または
GO TO
label
C gotoステートメントを使用して、指定したlabelにジャンプします。
sqlprint()関数を使用して、エラーメッセージを標準エラー(標準エラー) に stderrます。 sqlprint()関数はsql error出力し、続いてsqlcaの内容を出力しsqlca 。 sqlerrm sqlerrmc 。
exit(1)を呼び出してエラーを通知し、プログラムを終了します。
C breakステートメントを実行します。このアクションをループで使用するか、ステートメントをswitchます。
CALL name ( args )
または
DO name ( args )
argsパラメーターで指定されたパラメーターを使用して、name parameterで指定されたC関数を呼び出します。
注:クライアントアプリケーションが上から下に実行されない場合でも、ECPGPlusコンパイラはプログラムを上から下に処理します 。コンパイラ指令は各行に順番に適用され、コンパイラが別の指令に遭遇するまで有効です。
7 参照
•
PROC モード
•
非 PROC モード
では PROCモードで、ECPGPlusはあなたをすることができます:
•
EXEC SQL BEGIN / END DECLARE SECTIONの 外部でホスト変数を宣言します 。
( -C PROC キーワード を含めることにより) PROC モードで ECPGPlusを呼び出す と、ECPGコンパイラは次のCプリプロセッサディレクティブ を受け入れます 。
#if 式
#ifdef symbolName
#ifndef symbolName
#elif 式
#define symbolNameの展開
#define symbolName ([ マクロ引数 ]) 展開
#undef symbolName
#defined( symbolName )
...
注意してください: EXEC ORACLE プリプロセッサディレクティブ は、ECPGコマンドラインで -C PROC を指定した場合にのみ機能します 。
互換モードでECPGPlusを使用する場合は、使用することができます SELECT _ ERROR 収容することができますホスト変数よりも多くの行が含まれている結果セットを処理するために、どのようにあなたのプログラムを指示するプリコンパイラ・オプションを。構文は次のとおりです。
デフォルト値は YES です。 結果セットがホスト変数の容量を超える場合 、 SELECT ステートメントはエラーメッセージを返します。 NO を 指定すると 、ホスト変数が対応できない行を SELECT ステートメントが返した ときにエラーメッセージを抑制するようにプログラムに指示します 。
EXEC SELECT _ ERROR を 使用します ORACLE OPTION ディレクティブ。
-C PROC コマンドラインオプションを 含めない 場合:
非 PROC モードで 呼び出されると 、ECPGはPostgreSQL Coreドキュメントで説明されている動作を実装します。
ECPGPlusアプリケーションは、SQLデータ型( SMALLINT 、 DOUBLE PRECISION 、 CHARACTER VARYING )とCデータ型( short 、 double 、 varchar[ n ] )の 2つのデータ型セットを処理する必要があります 。アプリケーションがサーバーからデータをフェッチすると、ECPGPlusは各SQLデータ型を、データが返されるC変数の型にマップします。
ECPGPlusは、任意のSQLタイプをC文字値( char[ n ] または varchar[ n ] )に 変換できます 。任意のSQL型を char[ n ] または varchar[ n ] に/から安全に変換できます が、 int 、 double 、または float などのより自然なC型を使用すると便利 です。
•
•
int
•
•
•
•
Cでサポートされている数値型と文字型に加えて、 pgtypeslibランタイムライブラリは、日付/時刻と正確な数値を処理するためのカスタムデータ型(およびこれらの型を操作する関数)を提供します。
•
•
•
•
•
pgtypeslib 提供するデータ型を使用するには、適切なヘッダーファイルを#includeする必要があります。
次の表には、 外部データ型の型コードが含まれています。外部データ型は、Cホスト変数の型を示すために使用されます。アプリケーションが値をパラメーターにバインドするか、バッファーをSELECTリスト項目にバインドする場合、対応するSQLDA記述子のタイプコード( descriptor ->T[ column ] )を次のいずれかの値に設定する必要があります。
3
int
9
22
68
次の表には、 内部データ型の型コードが含まれています。内部型コードは、データベースに存在する値の型を示すために使用されます。 DESCRIBE SELECT LISTステートメントは、次の値を使用してデータ型配列( descriptor ->T[ column ] )を作成します。
1
2
8
11
12
23
RAW
24
96
100
101
104
187
188
189
190
232
{
};
N - エントリの最大数
N構造部材は、SQLDAが記述することができるエントリの最大数を含んでいます。このメンバーは、SQLDA構造を割り当てるときにsqlald()関数によって設定されます。 OPENまたはFETCHステートメントで記述子を使用する前に、 Nを説明されている値の実際の数に設定する必要があります。
V - データ値
V構造体は、データ値の配列へのポインタです。
以下のための SELECT -list記述子、 Vによって返される値の配列を指しFETCHステートメント(アレイの各メンバーは、結果セット内の列に相当します)。
バインド記述子の場合、 Vはパラメーター値の配列を指します(記述子を使用するカーソルを開く前に、この配列に値を入力する必要があります)。
アプリケーションは、各値を保持するために必要なスペースを割り当てる必要があります。 SELECTリスト値にスペースを割り当てる方法の例については、 displayResultSet()関数を参照してください ( セクション5.4 、不明な数の変数を使用したクエリの実行)。
L - 各データ値の長さ
L構造部材は、長さの配列へのポインタです。この配列の各メンバーは、 V配列の対応するメンバーで使用可能なメモリの量を示す必要があります。たとえば、 V[5]が20バイトのNULL終了文字列を保持するのに十分な大きさのバッファを指している場合、 L[5]には値21(文字列の文字に20バイトとNULL-ターミネーター)。アプリケーションは、 L配列の各メンバーを設定する必要があります。
T - データ型
T記述子によって記述されたデータタイプ、各列(またはパラメータ)のための1つのアレイに構造部材ポイント。
バインド記述子の場合、 T配列の各メンバーを設定して、ECPGPlusに各パラメーターのデータ型を通知する必要があります。
以下のために SELECT -list記述子、 DESCRIBE SELECT LIST文は、各メンバーセットT配列は、対応する列に見られるデータのタイプを反映します。
FETCHステートメントを実行する前にT配列のメンバーを変更して、 ECPGPlusに対応する値を特定のデータ型に変換させることができます。例えば、 DESCRIBE SELECT LISTステートメントが特定の列のタイプがDATEであることを示している場合、対応するTメンバーを変更して、次のFETCHステートメントがNULL終了文字列の形式でその値を返すように要求できます。 T配列の各メンバーは、数値型コードです(型コードのリストについては、 セクション7.3を参照してください)。 DESCRIBE SELECT LISTステートメントによって返されるタイプコードは、 FETCHステートメントによって予期されるタイプコードとは異なります。 DESCRIBE SELECT LISTステートメントの実行後、 T各メンバーは、データ型と 、対応する列がNULL入力可能かどうかを示すフラグをエンコードします。 sqlnul()関数を使用して、T配列のメンバーから型コードとNULL可能フラグを抽出できます。 sqlnul()関数のシグネチャは次のとおりです。
void sqlnul(unsigned short *valType,
unsigned short *typeCode,
int *isNull)
I - インジケーター変数
I標識変数の配列に構造部材ポイント。 この配列は、アプリケーションが sqlald() 関数を 呼び出して記述子を割り当てるときに割り当てられます 。
以下のために SELECT -list記述子の各メンバI配列は、対応する列がNULL(非ゼロ)または非NULL(ゼロ)の値を含むかどうかを示しています。
バインドパラメーターの場合、アプリケーションは I配列の各メンバーを設定して 、対応するパラメーター値がNULLかどうかを示す必要があります。
F - エントリーの数
F構造部材は、記述子によって記述されているどのように多くの値を示し( N構造部材は、記述子によって記述することができる値の最大数を示し、 F値の実際の数を示します)。 Fメンバーの値は、 DESCRIBEステートメントの実行時にECPGPlusによって設定されます。 Fは正、負、またはゼロです。
以下のために SELECT -list記述子、 F結果セット内の列の数は(によって決定されるように記述することによって許可される値の最大数以下であれば正の値を含むN構造部材)ステートメントがSELECTステートメントでない場合は0、クエリがN構造メンバーで許可されているよりも多くの列を返す場合は負の値。
バインド記述子の場合、ステートメントで見つかったパラメーターの数が記述子で許可されている値の最大数( N構造メンバーによって決定される)以下である場合、 Fには正の数が含まれます。ステートメントにパラメーターマーカーが含まれていない場合は0、ステートメントにN構造メンバーで許可されているよりも多くのパラメーターマーカーが含まれている場合は負の値。
Fに正の数が含まれている場合 ( DESCRIBEステートメントの実行後)、その数は結果セットの列数( SELECTリスト記述子の場合)またはステートメントで見つかったパラメーターマーカーの数(バインド記述子の場合)を反映します。場合はF負の値が含まれている、あなたは絶対値計算することができるF必要としているどのように多くの値(またはパラメーター・マーカー)を発見します。たとえば、 SELECTリストの記述後にFに-24が含まれている場合、クエリが24列を返すことがわかります。
S - 列/パラメーター名
S NULLで終了する文字列の配列に構造部材ポイント。
以下のために SELECT -list記述子、 DESCRIBE SELECT LISTステートメントは、結果セット内の対応する列の名前このアレイの各メンバーを設定します。
バインド記述子の場合、 DESCRIBE BIND VARIABLESステートメントは、この配列の各メンバーを対応するバインド変数の名前に設定します。
M - 列/パラメーター名の最大長
Mの長さの配列に構造部材ポイント。この配列の各メンバーは、 S配列の対応するメンバーの最大長を指定します(つまり、 M[0]はS[0]で見つかった列/パラメーター名の最大長を指定します)。この配列は、 sqlald()関数によって設定されます。
C - 実際の列/パラメーター名の長さ
C長さの配列に構造部材ポイント。この配列の各メンバーは、 S配列の対応するメンバーの実際の長さを指定します(つまり、 C[0]はS[0]で見つかった列/パラメーター名の実際の長さを指定します)。
この配列は、 DESCRIBEステートメントによって設定されます。
X - インジケーター変数名
X NULLで終了する文字列の配列に構造部材ポイント-各文字列の対応する値のNULLインジケータの名前を表します。
Y - インジケーター名の最大長
Y構造部材は、長さの配列を指します。この配列の各メンバーは、 X配列の対応するメンバーの最大長を指定します(つまり、 Y[0]はX[0]で見つかったインジケーター名の最大長を指定します)。
Z - 実際のインジケーター名の長さ
Z長さの配列に構造部材ポイント。この配列の各メンバーは、 X配列の対応するメンバーの実際の長さを指定します(つまり、 Z[0]は、 X[0]で見つかったインジケーター名の実際の長さを指定します)。
Advanced Server SQLステートメントをCプログラムに埋め込むことができます。各ステートメントはキーワード EXEC SQLで始まり、セミコロン( ; )で終わる必要があります。 Cプログラム内では、SQLステートメントは次の形式を取ります。
EXEC SQL sql_command_body ;
どこ sql_command_body 、標準のSQL文を表します。ホスト変数は、SQLステートメントが値式を予期する任意の場所で使用できます。値式をホスト変数に置き換える方法の詳細については、 セクション3.1.2 、 ホスト変数の宣言 を参照してください 。
ECPGPlusは、一部のステートメントのPostgreSQLサーバー側構文を拡張します。これらのステートメントの構文の違いについては、以下のリファレンスセクションで説明します。他のSQLコマンドでサポートされている構文の完全なリファレンスについては、次の場所にあるPostgreSQL Core Documentationを参照してください。
ALLOCATE DESCRIPTORステートメントを使用して 、SQL記述子領域を割り当てます。
EXEC SQL [FOR array_size ] ALLOCATE DESCRIPTOR descriptor_name
[WITH MAX
variable_count ];
array_sizeは、記述子に割り当てる配列要素の数を指定する変数です。 array_sizeはINTEGER値またはホスト変数です。
descriptor_nameは、記述子の名前または記述子の名前を含むホスト変数です。この値は、識別子、引用符付き文字列リテラル、またはホスト変数の形式をとることがあります。
variable_countは、記述子内のホスト変数の最大数を指定します。デフォルト値variable_count ある 100 。
次のコードフラグメントは、配列( emp_array )として処理できるemp_queryという名前の記述子を割り当てます 。
7.5.2 呼び出し
CALLステートメントを使用して、サーバー上のプロシージャまたは関数を呼び出します。 CALLステートメントはAdvanced Serverでのみ機能します。 CALLステートメントには2つの形式があります。最初の形式は関数を呼び出すために使用されます:
EXEC SQL CALL program _ name '('[ actual_arguments ]')'
INTO [[:
ret _ variable ][: ret _ indicator ]];
EXEC SQL CALL program _ name '('[ actual_arguments ]')';
program_nameは、 CALLステートメントが呼び出すストアドプロシージャまたは関数の名前です。プログラム名は、スキーマ修飾またはパッケージ修飾(またはその両方)にすることができます。プログラムが存在するスキーマまたはパッケージを指定しない場合、ECPGPlusはsearch_pathの値を使用してプログラムを見つけます。
actual_argumentsは、プログラムに必要な引数のコンマ区切りリストを指定します。各actual_argumentは、プログラムで予期される正式な引数に対応することに注意してください。各仮引数は、 INパラメーター、 OUTパラメーター、またはINOUTパラメーターです。
: ret_variableは、プログラムが関数である場合に返される値を受け取るホスト変数を指定します。
: ret_indicatorは、プログラムが関数である場合、返されるインジケーター値を受け取るホスト変数を指定します。
たとえば、次のステートメントは、 : enameホスト変数に含まれる値でget_job_desc関数を呼び出し、その関数によって返される値を: jobホスト変数にキャプチャします。
7.5.3 閉じる
CLOSEステートメントを使用してカーソルを閉じ、カーソルが現在使用しているリソースをすべて解放します。クライアントアプリケーションは、閉じたカーソルから行をフェッチできません。 CLOSEステートメントの構文は次のとおりです。
EXEC SQL CLOSE [ cursor_name ];
cursor_nameは、ステートメントによって閉じられたカーソルの名前です。カーソル名は、識別子またはホスト変数の形式をとることがあります。
OPEN 文は、カーソルを初期化します。初期化されると、カーソルが再度開かない限り、カーソル結果セットは変更されません。 カーソルを再度開く前 に CLOSE 必要はありません 。
emp_cursor という emp_cursor カーソルを手動で閉じるには、次のコマンドを使用します。
7.5.4 コミット
COMMITステートメントを使用して現在のトランザクションを完了し、すべての変更を永続化し、他のユーザーに見えるようにします。構文は次のとおりです。
EXEC SQL [AT database_name ] COMMIT [WORK]
[COMMENT
'text' ] [COMMENT 'text' RELEASE];
database_nameは、作業が存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。
互換性のために、ECPGPlusはエラーなしでCOMMENT句を受け入れますが、 COMMENT句に含まれるテキストは保存しません 。
コミットの実行後に現在の接続を閉じるには、 RELEASE句を含めます 。
たとえば、次のコマンドは、 deptデータベースで実行されたすべての作業をコミットし 、現在の接続を閉じます。
デフォルトでは、ステートメントは、クライアントアプリケーションが COMMIT ステートメントを 実行するときにのみコミットされます 。 ECPGPlusを呼び出すときに -t オプションを 含め て、クライアントアプリケーションが AUTOCOMMIT 機能 を呼び出すように指定し ます。 次のステートメントを使用して、クライアントアプリケーションの AUTOCOMMIT 機能を 制御することもでき ます。
7.5.5 CONNECT
CONNECTステートメントを使用して、データベースへの接続を確立します。 CONNECTステートメントには2つの形式があります。1つはOracleデータベースと互換性があり、もう1つは互換性がありません。
EXEC SQL CONNECT
{{:
user_name IDENTIFIED BY : password } | : connection_id }
[AT
database _ name ]
[USING :
database_string ]
[ALTER AUTHORIZATION :new_password];
user _ nameは、クライアントアプリケーションがサーバーへの接続に使用するロールを含むホスト変数です。
passwordは、そのロールに関連付けられたパスワードを含むホスト変数です。
connection_idは、データベースへの接続に使用されるスラッシュ区切りのユーザー名とパスワードを含むホスト変数です。
接続を確立するデータベースを指定するには、 AT句を含めます 。 database_nameは、クライアントが接続しているデータベースの名前です。値を変数の形式で、または文字列リテラルとして指定します。
USING句を含めて 、接続が確立されるデータベースを識別するヌル終了文字列を含むホスト変数を指定します。
ALTER AUTHORIZATION 句は、構文の互換性のためにのみサポートされています。 ECPGPlusは ALTER 解析します AUTHORIZATION 句、および警告を報告します。
クライアントアプリケーションは、 CONNECTステートメントの最初の形式を使用して、次のコマンドを使用して、接続ロールのIDを含むuserという名前のホスト変数と、関連付けられたpasswordを含むpasswordという名前のホスト変数との接続を確立します。
クライアントアプリケーションは、 CONNECT文の最初の形式を使用して、 :connection_idという名前の単一のホスト変数を使用して接続を確立することもでき :connection_id 。次の例では、 connection_idには、ユーザーのスラッシュ区切りのロール名と関連パスワードが含まれています。
CONNECTステートメントの2番目の形式の構文は次のとおりです。
EXEC SQL CONNECT TO database_name
[AS
connection_name ] [ credentials ];
どこ credentials 、次のいずれかです。
USER user_name password
USER
user _ name password IDENTIFIED BY
USER
user _ name USING password
database_nameは、クライアントが接続しているデータベースの名前またはIDです。次のいずれかの形式で、 database_nameを変数または文字列リテラルとして指定しdatabase_name 。
database _ name [@ hostname ][: port ]
tcp:postgresql:// hostname [: port ][/ database _ name ][ options ]
unix:postgresql:// hostname [: port ][/ database _ name ][ options ]
hostnameは、データベースが存在するサーバーの名前またはIPアドレスです。
portは、サーバーがリッスンするポートです。
DEFAULT 値を指定して、デフォルトのロール名を使用してデフォルトのデータベースとの接続を確立することもできます 。ターゲットデータベースとしてDEFAULTを指定する場合は、 connection_nameまたはcredentials含めないでください。
connection_nameは、データベースへの接続の名前です。 connection_nameは、識別子の形式をとる必要があります(つまり、文字列リテラルまたは変数ではありません)。各接続に一意のconnection_nameを指定することにより、複数の接続を開くことができます。
接続の名前を指定しない場合、 ecpglibは接続にDEFAULTという名前を割り当てます。任意のEXEC SQLステートメントで名前( DEFAULT )で接続を参照できSQL 。
CURRENTは、最後に開かれた、または最新のSET CONNECTION TOステートメントで言及されたSET CONNECTION TOです。 EXEC SQLステートメントで名前で接続を参照しない場合、ECPGは接続の名前をCURRENTとCURRENTます。
user _ nameは、Advanced Serverデータベースとの接続を確立するために使用されるロールです。指定されたロールの特権は、接続を介して実行されるすべてのコマンドに適用されます。
passwordは、指定されたuser_name関連付けられたパスワードです。
次のコードは、2番目の形式の使用 CONNECT という名前のデータベースへの接続を確立するために文を edb 役割使用して、 alice とその役割、関連付けられたパスワード 1safepwd :
接続の名前は acctg_connです。 SET CONNECTIONステートメントを使用して接続名を変更するときに、接続名を使用できます。
使用し DEALLOCATE DESCRIPTORに割り当てられた記述子が使用してメモリを解放する声明を。ステートメントの構文は次のとおりです。
EXEC SQL DEALLOCATE DESCRIPTOR descriptor _ name
descriptor _ nameはdescriptor nameです。この値は、引用符付き文字列リテラルまたはホスト変数の形式をとることがあります。
使用 DECLARE CURSORカーソルを定義するステートメントを。ステートメントの構文は次のとおりです。
EXEC SQL [AT database_name ] DECLARE cursor_name CURSOR FOR ( select _ statement | statement _ name );
database_nameは、カーソルが動作するデータベースの名前です。この値は、識別子またはホスト変数の形式をとることがあります。データベース名を指定しない場合、デフォルト値のdatabase_nameデフォルトのデータベースです。
cursor_nameは、カーソルの名前です。
select_statementは、カーソルの結果セットを定義するSELECTステートメントのテキストです。 SELECTステートメントにINTO句を含めることはできません。
statement_nameは、カーソル結果セットを定義するSQLステートメントまたはブロックの名前です。
使用 DECLARE DATABASE (例えば、内の後続のSQLステートメントで使用するデータベース識別子を宣言するためのステートメントをCONNECT声明)。構文は次のとおりです。
EXEC SQL DECLARE database _ name DATABASE;
database_nameは、データベースの名前を指定します。
次の例は、 acctgデータベースの識別子の宣言を示して acctgます。
acctgをデータベース識別子として宣言するコマンドを呼び出した後 、接続の確立時またはAT句でacctgデータベースを名前で参照できます。
7.5.9 DECLARE文
DECLARE STATEMENTディレクティブを使用して 、SQLステートメントの識別子を宣言します。 Advanced Serverは、 DECLARE STATEMENTディレクティブの2つのバージョンをサポートしています。
EXEC SQL [ database _ name ] DECLARE statement _ name STATEMENT;
EXEC SQL DECLARE STATEMENT statement _ name ;
statement_nameは、ステートメントに関連付けられた識別子statement_name指定します。
database_nameは、データベースの名前を指定します。この値は、識別子または識別子を含むホスト変数の形式をとることがあります。
DECLARE STATEMENTディレクティブを含む一般的な使用シーケンスは次のとおりです。
7.5.10 削除
DELETEステートメントを使用して 、テーブルから1つ以上の行を削除します。 ECPGPlus DELETEステートメントの構文はSQLステートメントの構文と同じですが、パラメーターマーカーとホスト変数は、式が許可されている任意の場所で使用できます。構文は次のとおりです。
[FOR exec_count ] DELETE FROM [ONLY] table [[AS] alias ]
[USING _ list using ]
[WHERE condition | WHERE CURRENT OF cursor _ name ]
[{RETURNING|RETURN}
* | output _ expression [[ AS] output _ name ] [, ...] INTO host_variable_list ]
FOR exec_count句を含めて 、ステートメントを実行する回数を指定します。この句は、 VALUES句が配列または配列へのポインタを参照する場合にのみ有効です。
tableは、既存のテーブルの名前(オプションでスキーマ修飾)です。 ONLY句を含めて、処理を指定されたテーブルに制限します。 ONLY句を含めない場合、名前付きテーブルから継承するテーブルも処理されます。
aliasは、ターゲットテーブルの代替名です。
using_listはテーブル式のリストであり、他のテーブルの列をWHERE条件に表示できます。
WHERE句を含めて、削除する行を指定します。ステートメントにWHERE句を含めない場合、 DELETEはテーブルからすべての行を削除し、テーブル定義をそのまま残します。
condition は、 BOOLEAN 型の値を返す式、ホスト変数、またはパラメーターマーカーです 。 condition がtrueを返す 行は 削除されます。
cursor_nameは、 WHERE CURRENT OF句で使用するカーソルの名前です。削除される行は、このカーソルから最後にフェッチされた行になります。カーソルは、 DELETEステートメントのターゲットテーブルに対する非グループ化クエリでなければなりません。ブール条件を含むDELETEステートメントでWHERE CURRENT OFを指定することはできません。
RETURN / RETURNING句は、指定しoutput _ expressionまたはhost _ variable _ listによって返されたDELETE各列が削除された後のコマンドを:
output_expressionは、各行が削除された後にDELETEコマンドによって計算され、返される式です。 output_nameは、返された列の名前です。 *を含めると、すべての列が返されます。
host_variable_listは、ホスト変数とオプションのインジケータ変数のコンマ区切りリストです。各ホスト変数は、 RETURNING句から対応する値を受け取ります。
たとえば、次の文は、 sal列にホスト変数:max_sal指定された値より大きい値が含まれるempテーブルからすべての行を削除します 。
DELETEステートメントの使用の詳細については、次の場所にあるPostgreSQL Coreドキュメントを参照してください。
7.5.11 DESCRIBE
DESCRIBEステートメントを使用して 、準備済みステートメントで必要な入力値の数、または準備済みステートメントで返される出力値の数を見つけます。 DESCRIBEステートメントは、アプリケーションの作成時に形状が不明なSQLステートメントを分析するために使用されます。
DESCRIBE文は移入SQLDA記述を、 SQL記述子を移入するには、 ALLOCATE DESCRIPTORおよびDESCRIBE…DESCRIPTOR文を使用します。
EXEC SQL DESCRIBE BIND VARIABLES FOR statement _ name INTO descriptor;
EXEC SQL DESCRIBE SELECT LIST FOR statement_name INTO descriptor;
statement_nameは、準備されたSQL ステートメントまたはPL / SQLブロックに関連付けられた識別子です。
descriptorは、 SQLDA*型のC変数の名前です。 DESCRIBEステートメントを実行する前に、 sqlald()呼び出して(および記述子を初期化してsqlald()記述子のスペースを割り当てる必要があります。
DESCRIBEステートメントの最初の形式を実行すると 、ECPGは指定された記述子に各入力の説明を入力します ステートメントに必要な変数。たとえば、2つの記述子がある場合:
2番目の形式を実行すると、ECPGは、指定された記述子に 、ステートメントによって返された各値の説明を入力します。たとえば、次のステートメントは3つの値を返します。
ステートメントを実行する 前に 、各入力値の変数と各出力値の変数をバインドする必要があります。入力値にバインドする変数は、ステートメントで使用される実際の値を指定します。出力値にバインドする変数は、ステートメントの実行時に値を配置する場所をECPGPlusに指示します。
これは、 DESCRIBE 代替Pro * C互換構文です DESCRIPTOR ステートメント。
使用 DESCRIBE DESCRIPTOR SQL文に関する情報を取得し、SQL記述子にその情報を格納するためのステートメントを。 DESCRIBE DESCRIPTORを使用する前に、 ALLOCATE DESCRIPTORステートメントで記述子を割り当てる必要があります。構文は次のとおりです。
EXEC SQL DESCRIBE [INPUT | OUTPUT] statement _ identifier
USING
[SQL] DESCRIPTOR descriptor _ name ;
statement_nameは、準備されたSQLステートメントの名前です。
descriptor_nameはdescriptor_nameの名前です。 descriptor_nameは、引用符で囲まれたストリング値、または記述子の名前を含むホスト変数です。
INPUT句を含めると 、ECPGPlusは指定された記述子に各入力の説明を入力します ステートメントに必要な変数。
INPUT句を指定しない場合 、 DESCRIBE DESCRIPTORは、指定された記述子にステートメントによって返された値を取り込みます。
OUTPUT句を含めると 、ECPGPlusは、指定された記述子に、ステートメントによって返された各値の説明を取り込みます。
EXEC SQL DESCRIBE OUTPUT FOR get_emp USING 'query_values_out';
7.5.13 切断
DISCONNECTステートメントを使用して、サーバーへの接続を閉じます。構文は次のとおりです。
EXEC SQL DISCONNECT [ connection _ name ][CURRENT][DEFAULT][ALL];
connection_nameは、接続の確立に使用されるCONNECTステートメントで指定された接続名です。接続名を指定しない場合、現在の接続は閉じられます。
CURRENTキーワードを含めて、 ECPGPlusが最近使用した接続を閉じるように指定します。
DEFAULTキーワードを含めて、 ECPGPlusがDEFAULTという名前の接続を閉じるように指定します。接続を開くときに名前を指定しない場合、ECPGPlusは接続に名前DEFAULT割り当てます。
ALLキーワードを含めて、アクティブな接続をすべて閉じるようにECPGPlusに指示します。
次の例では 、 hrデータベースに接続する接続( hr_connection )を作成し、接続から切断します。
{
}
7.5.14 EXECUTE
使用 EXECUTE用いて調製された以前のステートメントを実行する文をEXEC SQL PREPARE文を。構文は次のとおりです。
EXEC SQL [FOR array _ size ] EXECUTE statement _ name
[USING {DESCRIPTOR
SQLDA_descriptor
|:
host_variable [[INDICATOR] : indicator_variable ]}];
array _ sizeは、整数値、または処理する行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
statement_nameは、ステートメントの作成時に( EXEC SQL PREPAREステートメントを使用して)ステートメントに割り当てられた名前statement_name指定します。
USING句を含めて 、準備されたステートメント内のパラメーターの値を指定します。
DESCRIPTOR SQLDA_descriptor句を含めて 、パラメーターにSQLDA記述子値を提供します。
使用し host_variable (およびオプションindicator_variableパラメータのユーザ指定の値を提供します)。
使用 EXECUTEにより以前に準備されたステートメントを実行する文をEXEC SQL PREPARE SQL記述子を使用して、文を。構文は次のとおりです。
EXEC SQL [FOR array_size ] EXECUTE statement_identifier
[USING [SQL] DESCRIPTOR
descriptor_name ]
[INTO [SQL] DESCRIPTOR
descriptor _ name ];
array _ sizeは、整数値、または処理する行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
statement_identifierは、 EXEC SQL PREPAREステートメントでステートメントに割り当てられた識別子statement_identifier指定しPREPARE 。
USING句を含めて 、準備されたステートメントに必要な入力パラメーターの値を指定します。
INTO句を含めて 、準備されたステートメントによって返された結果をEXECUTEステートメントが書き込む記述子を指定します。
descriptor_nameは、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。
次の例では 、記述子stmtText含まれる値を使用して、準備されたステートメント give_raise 実行します。
EXECUTE…END-EXECステートメントを使用して 、匿名ブロックをクライアントアプリケーションに埋め込みます。構文は次のとおりです。
EXEC SQL [AT database_name ] EXECUTE anonymous_block END-EXEC;
database_nameは、データベース識別子またはデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースで実行されます。
anonymous_blockは、PL / pgSQLまたはSPLステートメントと宣言のインラインシーケンスです。ブロック内にホスト変数とオプションのインジケータ変数を含めることができます。そのような各変数は、 IN/OUT値として扱われます。
注: EXECUTE … END EXECステートメントはAdvanced Serverでのみサポートされています。
EXECUTE IMMEDIATEステートメントを使用して、SQLコマンドを含む文字列を実行します。構文は次のとおりです。
EXEC SQL [AT database _ name ] EXECUTE IMMEDIATE command _ text ;
database_nameは、データベース識別子またはデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースで実行されます。
command_textは、 EXECUTE IMMEDIATEステートメントによって実行されるコマンドです。
次の例では、 :command_textホスト変数に含まれる コマンドを実行します。
7.5.18 FETCH
FETCHステートメントを使用して 、カーソルからSQLDA記述子またはホスト変数のターゲットリストに行を返します。 FETCHステートメントを使用してカーソルから情報を取得する前に、 DECLAREおよびOPENステートメントを使用してカーソルを準備する必要があります。ステートメントの構文は次のとおりです。
EXEC SQL [FOR array_size ] FETCH cursor
{ USING
DESCRIPTOR SQLDA_descriptor }|{ INTO target_list };
array _ sizeは整数値またはフェッチする行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
cursorは、行をフェッチするカーソルの名前、またはカーソルの名前を含むホスト変数です。
USING句を含めると、 FETCHステートメントは指定されたSQLDA記述子にサーバーから返された値を取り込みます。
INTO句を含めると、 FETCHステートメントはtarget_list指定されたホスト変数(およびオプションのインジケーター変数)を設定します。
次のコードは、名前のカーソルを宣言し employeesから従業員番号、名前、給料を取得しemp表を:
使用 FETCH DESCRIPTOR SQL記述子にカーソルから行を取得する声明を。構文は次のとおりです。
EXEC SQL [FOR array _ size ] FETCH cursor
INTO [SQL] DESCRIPTOR
descriptor _ name ;
array _ sizeは整数値またはフェッチする行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
cursorは、行のフェッチ元のカーソルの名前、またはカーソルの名前を含むホスト変数です。クライアントは、 FETCH DESCRIPTORステートメントを呼び出す前に、カーソルをDECLAREおよびOPENする必要があります。
INTO 句を 含めて 、準備されたステートメントによって返された結果を EXECUTE ステートメントが書き込む SQL記述子を指定します 。 descriptor_name は、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。使用する前に、 ALLOCATE を使用して記述子を割り当てる必要があります DESCRIPTOR ステートメント。
次の例では、結果セット内の特定の行の説明と値を保持するrow_descという名前の記述子を割り当てます。次に、結果セットの行をループする前に、 FETCHを使用してカーソルから次の行を記述子に取得する前に、準備済みステートメント( my_cursor )のカーソルを宣言して開きます。
{
使用し GET DESCRIPTOR記述子から情報を取得するために文を。 GET DESCRIPTORステートメントには2つの形式があります。最初の形式は、記述子内の値(または列)の数を返します。
EXEC SQL GET DESCRIPTOR descriptor _ name
:
host _ variable = COUNT;
EXEC SQL [FOR array _ size ] GET DESCRIPTOR descriptor _ name
VALUE
column _ number {: host _ variable = descriptor_item {,…}};
array _ size は、整数値、または処理する行数を指定する整数値を含むホスト変数です。あなたが指定した場合 array_size 、 host_variable その大きさの配列でなければなりません。場合、例えば、 array_size ある 10 、 :host_variable 10員アレイである必要があり host_variables 。 FOR 句 を省略する と、ステートメントは配列の各メンバーに対して1回実行されます。
descriptor_nameは、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。
VALUE句を含めて 、記述子から取得した情報を指定します。
column_numberは、記述子内の変数の位置を識別します。
host_variableは、アイテムの値を受け取るホスト変数の名前を指定します。
descriptor_itemは、取得した記述子項目のタイプを指定します。
ECPGPlusは、次の descriptor_itemタイプを実装しています 。
•
•
•
•
•
•
•
•
次のコードは、 GET DESCRIPTORステートメントを使用して、ユーザーが指定した文字列に入力された列の数を取得する方法を示しています。
この例では、SQL記述子( parse_desc という parse_desc )を割り当ててから、 PREPAREステートメントを使用して、ユーザーが提供した文字列を構文チェックします( :stmt )。 DESCRIBEステートメントは、ユーザーが指定した文字列を記述子parse_desc移動します。 EXEC SQL GET DESCRIPTORの呼び出しは、記述子に問い合わせて、結果セット内の列数( :col_count )を検出します。
7.5.21 挿入
INSERTステートメントを使用して、 1つ以上の行をテーブルに追加します。 ECPGPlusのINSERTステートメントの構文はSQLステートメントの構文と同じですが、値が許可される場所であればどこでもパラメーターマーカーとホスト変数を使用できます。構文は次のとおりです。
[FOR exec_count ] INSERT INTO table [( column [, ...])]
{DEFAULT VALUES |
VALUES ({ expression | DEFAULT} [, ...])[, ...] | query }
[RETURNING * | output _ expression [[ AS ] output _ name ] [, ...]]
FOR exec_count句を含めて 、ステートメントを実行する回数を指定します。この句は、 VALUES句が配列または配列へのポインタを参照する場合にのみ有効です。
tableは、既存のテーブルの(オプションでスキーマ修飾された)名前を指定します。
columnは、テーブル内の列の名前です。列名は、サブフィールド名または配列添え字で修飾できます。すべての列にデフォルト値を使用するには、 DEFAULT VALUES句を指定します。
expressionは、対応する列に割り当てられる式、値、ホスト変数、またはパラメーターマーカーです。 DEFAULTを指定すると、対応する列にデフォルト値が入力されます。
queryは、挿入する行を提供するSELECTステートメントを指定しquery 。
output_expressionは、各行が挿入された後にINSERTコマンドによって計算されて返される式です。式は、テーブル内の任意の列を参照できます。 *を指定すると、挿入された行のすべての列が返されます。
output_nameは、返される列に使用する名前を指定します。
次の例では、 employeesテーブルに行を追加します。
INSERTステートメントはホスト変数(: ename )を使用してename列の値を指定することに注意してください 。
INSERTステートメントの使用の詳細については、次の場所にあるPostgreSQL Coreドキュメントを参照してください。
7.5.22 OPEN
OPENステートメントを使用して、カーソルを開きます。構文は次のとおりです。
EXEC SQL [FOR array _ size ] OPEN cursor [USING parameters ];
どこ parameters 、次のいずれかです。
DESCRIPTOR SQLDA _ descriptor
または
host _ variable [ [ INDICATOR ] indicator _ variable , … ]
array _ sizeは整数値またはフェッチする行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
cursorは、開かれているカーソルの名前です。
parametersは、 DESCRIPTOR SQLDA _ descriptorまたはカーソルを初期化するホスト変数(およびオプションのインジケーター変数)のコンマ区切りリストです。 SQLDA_descriptor指定する場合、記述子はDESCRIBEステートメントで初期化する必要があります。
OPEN 文はで提供された値使用してカーソルを初期化 parameters 。初期化されると、カーソルを閉じて再度開かない限り、カーソル結果セットは変更されません。アプリケーションが終了すると、カーソルは自動的に閉じられます。
次の例で は、 emp テーブル を照会する employees という名前のカーソルを宣言し、名前がユーザー指定の値(ホスト変数:emp_name格納されている)と一致する従業員の従業員番号、名前、給与および歩合を返します。
emp
...
カーソルを宣言した後、この例では OPENステートメントを使用して、カーソルの内容をクライアントアプリケーションで使用できるようにします。
7.5.23 オープン記述子
OPEN DESCRIPT OR ステートメントを 使用 して、SQL記述子でカーソルを開きます 。構文は次のとおりです。
EXEC SQL [FOR array _ size ] OPEN cursor
[USING [SQL] DESCRIPTOR
descriptor _ name ]
[INTO [SQL] DESCRIPTOR
descriptor _ name ];
array _ sizeは整数値またはフェッチする行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
cursorは、開かれているカーソルの名前です。
descriptor_nameは、SQL記述子の名前(単一引用符で囲まれた文字列リテラルの形式)またはカーソルを初期化するクエリを含むSQL記述子の名前を含むホスト変数を指定します。
たとえば、次のステートメントは、ホスト変数:employeesを使用してカーソル( emp_cursor という emp_cursor )を開きます 。
7.5.24 PREPARE
PREPAREステートメントを使用して 、SQLステートメントまたはPL / pgSQLブロックを実行用に準備します。このステートメントには2つの形式があります。最初の形式は次のとおりです。
EXEC SQL [AT database _ name ] PREPARE statement _ name
FROM
sql _ statement ;
EXEC SQL [AT database _ name ] PREPARE statement _ name
AS
sql _ statement ;
database_nameは、データベース識別子、またはステートメントが実行されるデータベース識別子を含むホスト変数です。 AT句を省略すると、 ステートメントは現在のデフォルトデータベースに対して実行されます。
statement_name は、準備されたSQLステートメントまたはPL / SQLブロックに関連付けられた識別子です。
sql _ statement は、 SELECT ステートメント、一重引用符で囲まれた文字列リテラル、またはSQLステートメントのテキストを含むホスト変数 の形式を取る場合 があります。
準備されたステートメント内に変数を含めるには 、ステートメント を PREPARE する ときに変更される可能性のあるステートメント値を プレースホルダー( $1 、 $2 、 $3 など) に置き換え ます 。あなたはときに EXECUTE 文を、各パラメータの値を提供します。値は、プレースホルダーを置き換える順序で提供する必要があります。
次の例では 、 emp テーブルに レコードを挿入 する準備済みステートメント( add_emp という add_emp )を 作成し ます。
注:クライアントアプリケーションは 、ステートメントが実行される各セッション内で PREPARE ステートメントを 発行する必要 があります。準備されたステートメントは、現在のセッションの間だけ持続します。
7.5.25 ROLLBACK
ROLLBACKステートメントを使用して 、現在のトランザクションを中止し、トランザクションによって行われた更新を破棄します。構文は次のとおりです。
EXEC SQL [AT database _ name ] ROLLBACK [WORK]
[ { TO [SAVEPOINT]
savepoint } | RELEASE ]
database_nameは、データベース識別子、またはステートメントが実行されるデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースに対して実行されます。
指定されたsavepoint後に実行されたコマンドを中止するには、 TO句を含めます 。 SAVEPOINTステートメントを使用して、 savepointを定義します。 TO句を省略すると、 ROLLBACKステートメントはトランザクションを中止し、すべての更新を破棄します。
アプリケーションにEXEC SQL COMMIT RELEASEを実行させ、接続を閉じるには、 RELEASE句を含めます 。
my_savepoint 後に発生したトランザクションの部分のみがロールバックされます。 my_savepointは保持されmy_savepointが、 my_savepoint後に作成されたセーブポイントは消去されます。
7.5.26 SAVEPOINT
使用 SAVEPOINT セーブポイントを定義する文を、セーブポイントは、トランザクション内のマーカーです。 ROLLBACKステートメントを使用して現在のトランザクションを中止し、サーバーの状態を指定されたセーブポイントの前の状態に戻すことができます。 SAVEPOINTステートメントの構文は次のとおりです。
EXEC SQL [AT database _ name ] SAVEPOINT savepoint_name
database_nameは、セーブポイントが存在するデータベース識別子を含むデータベース識別子またはホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースに対して実行されます。
savepoint_nameは、 savepoint_nameの名前です。 savepoint_nameを再使用すると、元のセーブポイントは破棄されます。
my_savepoint という名前のセーブポイントを作成するには、次のステートメントを含めます。
7.5.27 SELECT
ECPGPlusは 、 INTO host_variables句を提供することにより、SQL SELECTステートメントのサポートを拡張します 。この句により、指定された情報をAdvanced Serverデータベースからホスト変数に選択できます。 SELECTステートメントの構文は次のとおりです。
EXEC SQL [AT database_name ]
[ hint ]
[ ALL | DISTINCT [ ON( expression , ...) ]]
select_list INTO host _ variables
[ FROM from_item [, from_item ]...]
[ WHERE condition ]
[ hierarchical _ query _ clause ]
[ GROUP BY expression [, ...]]
[ HAVING condition ]
[ ORDER BY expression [ order_by_options ]]
[ LIMIT { count | ALL }]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE | SHARE } [OF table_name [, ...]][NOWAIT ][...]]
database_nameは、テーブルが存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。
host_variablesは、 SELECTステートメントによって入力されるホスト変数のリストです。 SELECTステートメントが複数の行を返す場合、 host_variablesは配列でなければなりません。
ECPGPlusは 、次の場所にあるPostgreSQL Coreドキュメントに記載されているSQL SELECTステートメントの追加句のサポートを提供します 。
INTO host_variables句を使用するには、 SELECTステートメントを指定するときに、定義済みのホスト変数の名前を含めます。たとえば、次のSELECTステートメントは、 :emp_nameおよび:emp_salホスト変数に従業員名と給与のリストを入力します。
拡張 SELECTステートメントでは、値が許可される句にパラメーターマーカー(疑問符)を含めることもできます。たとえば、次のクエリにはWHERE句にパラメーターマーカーが含まれています。
この SELECTステートメントを使用すると、実行時にdept_noパラメーターマーカーに値を指定できます。
SET CONNECTIONステートメントの構文は次のとおりです。
EXEC SQL SET CONNECTION connection _ name ;
connection_nameは、データベースへの接続の名前です。
SET CONNECTIONステートメントを使用するには、 CONNECTステートメントの2番目の形式を使用してデータベースへの接続を開く必要があります。 connection_nameを指定するAS句を含めます。
デフォルトでは、現在のスレッドは現在の接続を使用します。 SET 使用する 使用する現在のスレッドのデフォルト接続を指定する CONNECTION ステートメント。デフォルト接続は、 EXEC を実行するときにのみ使用されます 接続名を明示的に指定しない SQL ステートメント。たとえば、次のステートメントでは、 AT connection _ name 句が 含まれていないため、デフォルトの接続が使用されます 。 :
EXEC SQL AT acctg_conn DELETE FROM emp;
SET との接続間で変更できます CONNECTION ステートメント:
サーバーは、接続クライアントが使用できる特権を決定するときに、接続に関連付けられた特権を使用します。 acctg_conn 接続 を使用する場合 、クライアントはロール alice 関連付けられた特権を持ち ます。 hr_conn を使用して接続する と、クライアントは bob 関連付けられた権限を持ちます 。
ホスト変数または整数値の形式でクライアントアプリケーションから提供される情報を使用して、記述子領域に値を割り当てるには、 SET DESCRIPTORステートメントを使用します。ステートメントには2つの形式があります。最初の形式は次のとおりです。
EXEC SQL [FOR array _ size ] SET DESCRIPTOR descriptor _ name
VALUE
column_number descriptor _ item = host _ variable ;
EXEC SQL [FOR array _ size ] SET DESCRIPTOR descriptor _ name
COUNT = integer;
array _ sizeは整数値またはフェッチする行数を指定する整数値を含むホスト変数です。 FOR句を省略すると、ステートメントは配列の各メンバーに対して1回実行されます。
descriptor_nameは、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。
VALUE句を含めて 、記述子に格納されている情報を記述します。
column_numberは、記述子内の変数の位置を識別します。
descriptor_itemは、記述子項目のタイプを指定します。
host_variableは、アイテムの値を含むホスト変数の名前を指定します。
ECPGPlusは、次の descriptor_itemタイプを実装しています 。
•
•
たとえば 、クライアントアプリケーションは、動的に作成されたクエリの入力をユーザーに求める場合があります。
動的に作成されたクエリを実行するには、最初 にクエリを 準備 し(クエリの構文の解析と検証)、次に EXEC を使用してクエリで見つかっ た 入力 パラメータを 記述 する 必要があり ます。 SQL DESCRIBE INPUT ステートメント。
クエリを記述した後、 query_params記述子には、クエリに必要な各パラメーターに関する情報が含まれます。
次に、 EXEC SQL GET DESCRIPTORを使用して、各パラメーターの名前を取得できます。また、 EXEC SQL GET DESCRIPTORを使用して、記述子から各パラメーターのタイプ(パラメーターの数とともに)を取得することも、文字ストリングの形式で各値を指定することもでき、ECPGはそのストリングを必要なデータに変換しますタイプ。
最初のパラメーターのデータ型は numericです。 2番目のパラメーターのタイプはvarcharです。最初のパラメーターの名前はsalです。 2番目のパラメーターの名前はjobです。
GET DESCRIPTORを使用して 、パラメーターの名前をparam_nameホスト変数にコピーします。
値を各パラメーターに関連付けるには 、 EXEC SQL SET DESCRIPTORステートメントを使用しSQL 。例えば:
これで、 EXEC SQL EXECUTE DESCRIPTORステートメントを使用して、サーバー上で準備済みステートメントを実行できます。
7.5.30 更新
UPDATEステートメントを使用して、テーブルに保存されているデータを変更します。構文は次のとおりです。
EXEC SQL [AT database_name ][FOR exec_count ]
UPDATE [ ONLY ]
table [ [ AS ] alias ]
SET { column = { expression | DEFAULT } |
( column [, ...]) = ({ expression |DEFAULT } [, ...])} [, ...]
[ FROM from_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING *
| output_expression [[ AS ] output_name ] [, ...] ]
database_nameは、テーブルが存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。
FOR exec_count句を含めて 、ステートメントを実行する回数を指定します。この句は、 SET句またはWHERE句に配列が含まれる場合にのみ有効です。
ECPGPlusは、次のURLで入手可能なPostgreSQL Coreドキュメントに記載されているSQL UPDATEステートメントの追加句のサポートを提供します 。
次の UPDATEステートメントは、従業員( :enameホスト変数で識別される)のジョブ記述を:new_jobホスト変数に含まれる値に変更し、現在の給与に:increaseホストの値を掛けることにより従業員の給与を:increaseます。変数:
拡張された UPDATEステートメントでは、入力値が許可される句にパラメーターマーカー(疑問符)を含めることもできます。たとえば、 WHERE句にパラメーターマーカーを使用して同じ更新ステートメントを記述できます。
この UPDATEステートメントを使用すると、ユーザーにjob列の新しい値の入力を求め、 :ename指定された従業員のsal列の増分量を提供できます。
7.5.31 WHENEVER
WHENEVERステートメントを使用して 、クライアントアプリケーションがSQLエラーまたは警告を検出したときに実行するアクションを指定します。構文は次のとおりです。
EXEC SQL WHENEVER condition action ;
The server returns a that returns no rows, or when a SELECT that returns no rows, or when a FETCH reaches the end of a result set. that returns no rows, or when a The server returns a NOT FOUND condition when it encounters a that returns no rows, or when a reaches the end of a result set.
The server returns an condition when it encounters a serious error returned by an SQL statement. The server returns an SQLERROR condition when it encounters a serious error returned by an SQL statement. The server returns an condition when it encounters a serious error returned by an SQL statement.
The server returns an condition when it encounters a non-fatal warning returned by an SQL statement. The server returns an SQLWARNING condition when it encounters a non-fatal warning returned by an SQL statement. The server returns an condition when it encounters a non-fatal warning returned by an SQL statement.
CALL function [([ args ])]
Instructs the client application to a C break statement. A break statement may appear in a loop or a switch statement. If executed, the break statement terminate the Instructs the client application to a C break statement. A break statement may appear in a loop statement. If executed, the break statement terminate the loop or the switch statement.. statement. If executed, the break statement terminate the loop statement..
Instructs the client application to emit a C continue statement. A Instructs the client application to emit a C statement. A continue statement may only exist within a loop, and if executed, will cause the flow of control to return to the top of the loop.
DO function ([ args ])
GOTO label or
GO TO label