1 はじめに
• Oracleデータベースと互換性のある CALLステートメント。ほとんどのECPGPlusステートメントはコミュニティPostgreSQLで機能しますが、 CALLステートメントとEXECUTE … END EXECステートメントは、クライアントアプリケーションがEDB Postgres Advanced Serverに接続されている場合にのみ機能します。
1.1 このガイドで使用される表記規則以下の説明では、 用語は、言語キーワード、ユーザー指定の値、リテラルなどの単語または単語のグループを指します。用語の正確な意味は、使用されるコンテキストによって異なります。
• 斜体フォント は、通常、初めて定義する文に新しい用語を導入します。
• Fixed-width (mono-spaced) font は、 SQL ステートメント、例で使用される特定のテーブルおよび列名、プログラミング言語のキーワード など、文字どおりに指定する必要がある用語に使用され ます 。たとえば、 SELECT * FROM emp;
•
• 角括弧[]は、囲まれた用語の1つを置換することも、まったく置換しないこともあります。たとえば、 [ a | b ] 、「 a 」または「 b 」のいずれか、または2つのどちらも選択しないことを意味します。
•
•
埋め込み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ステートメントで言及されたテーブルが実際に存在することは確認できません。
• Cプリプロセッサディレクティブは、解釈または無視されます。このオプションは、 ECPGPlusを起動するときに入力されるコマンドラインオプション( -C PROC ) によって制御されます 。どちらの場合でも、ECPGPlusは各Cプリプロセッサディレクティブを変更せずに出力ファイル(4)にコピーします。ソースファイルで見つかったCプリプロセッサディレクティブは、出力ファイルに表示されます。
• 行10〜14には、埋め込みSQL宣言セクションが含まれています。
SQLコード内で参照するC変数は、 ホスト変数と 呼ばれ ます 。 Pro * Cモード( -C PROC )でECPGPlusプリプロセッサを呼び出す場合、SQLステートメント内の任意の C変数を参照できます。それ以外の場合は、 BEGIN/END DECLARATION SECTIONペア内で各ホスト変数を宣言する必要があります。プリプロセッサは上記のコードフラグメントを検出すると、Cコード(最初の行と最後の行)を変換せずに出力ファイルに渡し、各 EXEC SQLステートメントをecpglib関数の呼び出しにecpglibます。結果は次のようになります。
2.1 インストールと構成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 を保持するディレクトリを含むように検索パスを設定します 。
2.2 Makefileの構築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実行可能プログラムに。
コマンドラインにECPG構文に加えて-C PROCキーワードを含める場合 、Pro * Cコマンドライン構文を使用できます。例えば:
-C mode -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 . -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.
3.1 例-簡単なクエリ最初のコードサンプルは、 SELECTステートメント(単一の行を返す) を実行し、ホスト変数のグループに結果を保存する方法を示しています。ホスト変数を宣言した後、ハードコードされたロール名と関連するパスワードを使用してedbサンプルデータベースに接続し、 empテーブルを照会します。クエリは、宣言されたホスト変数に値を返します。 NULLインジケータ変数の値を確認した後、簡単な結果セットを画面に出力し、接続を閉じます。PROCモードでコードをプリコンパイルする予定がある場合は、 BEGIN DECLARE…END DECLAREセクションを省略できます。 ホスト変数の宣言の詳細については、 セクション3.1.2 、 宣言を 参照してください ホスト 変数 。宣言セクション内の各変数に関連付けられているデータ型は、Cデータ型です。 サーバーとクライアントアプリケーションの間で渡されるデータは、互換性のあるデータ型を共有する必要があります。データ型の詳細については、 セクション7.2 、 サポートを 参照してください C データ タイプ 。クライアントアプリケーションがSQLコードでエラーを検出した場合、サーバーは sqlprint 提供される sqlprint () 関数を使用して、エラーメッセージを標準エラー(標準エラー) に stderr し ecpglib 。次のEXEC SQLステートメントは、Advanced Serverとの接続を確立します。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 。
3.1.1 インジケータ変数の使用前の例には インジケーターが 含まれていました comm 列の 値 (サーバーから返されたとき)が NULL であった行を識別する 変数 。標識変数は、先行する変数の内容が NULL か切り捨てられているか を示す追加のホスト変数です 。インジケータ変数は、行の内容が保存されるときに入力されます。インジケータ変数には、次の値が含まれる場合があります。
クエリが 対応するホスト変数に NULL 値を NULL ないことが確実な場合は、インジケータ変数を省略でき ます。インジケータ変数を省略し、クエリが NULL 値を 返す 場合、 ecpglib は実行時エラーを発生させます。
3.1.2 ホスト変数の宣言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句に型互換のターゲット変数が必要です。これは、単一の行を取得する簡単な例です。複数の行を取得するには、次の例に示すように、カーソルを定義する必要があります。
1。
2。
3。
4。 ホスト変数を宣言した後、この例では 、ユーザー指定のロール名とパスワードを使用して edbデータベースに接続し 、 empテーブルを照会します。クエリは、employeesという名前のカーソルに値を返します。次に、サンプルコードはカーソルを開き、結果セットを一度に1行ずつループして結果セットを出力します。サンプルは結果セットの終わりを検出すると、接続を閉じます。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 ホスト変数(と :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 。
4 記述子の使用動的SQLを使用すると、クライアントアプリケーションは、実行時に構成されるSQLステートメントを実行できます。これは、クライアントアプリケーションを記述しているときに内容や形式がわからない場合に便利です。 ECPGPlusでは 、識別子(テーブル名、列名、インデックス名など)の代わりにホスト変数を使用でき ませ ん 。代わりに、動的SQLステートメントを使用して、情報を含む文字列を作成し、その文字列を実行する必要があります。文字列は、 記述子の 形式でクライアントとサーバーの間で渡されます 。記述子は、データとデータの形状に関する情報の両方を含むデータ構造です。クライアントアプリケーションは GET 使用する必要があります 記述子から情報を取得する DESCRIPTOR ステートメント。次の手順では、動的SQLを使用したクライアントアプリケーションの基本的なフローについて説明します。
1。
2。
4。 PREPAREステートメントを使用して 、SQLステートメントを解析および構文チェックします。
5。 DESCRIBEステートメントを使用して 、選択リストを選択リスト記述子に記述します。
6。 DESCRIBEステートメントを使用して、バインド変数記述子への入力パラメーターを記述します。
7。
8。
9。
10。 FETCHステートメントを使用して 、カーソルから各行をフェッチし、各行を選択リスト記述子に保存します。
11。
12。
4.1 例-記述子を使用してデータを返す
• コードサンプルは、C stdio および stdlib ライブラリ のプロトタイプと型定義 、SQLデータ型シンボル、およびSQLCA(SQLコミュニケーションエリア)構造 を含めることから始まり stdio 。クエリのメタデータをSQL記述子に移動する DESCRIBEステートメント。次に、アプリケーションは記述子に問い合わせて結果セットの列数を検出し、ホスト変数 col_countます。次に、 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テクニックの使用を検討してください。場合 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 。次に、プログラムは 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 。次に、プログラムは 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つのホスト変数の値は、コマンドライン引数から派生していることに注意してください。プログラムの実行が開始されると、エラーハンドラが設定され、データベースサーバーに接続されます。SQLDA記述子を割り当てる場合 、結果セットで検索することが予想される列の最大数( SELECTリスト記述子の場合)または動的クエリテキストを検索することが予想されるパラメーターの最大数(バインド変数記述子の場合)を指定します。 -この場合、20列と20パラメーターを超えないことを指定します。また、各列(またはパラメーター)名と各インジケーター変数名の最大長も指定する必要があります。この場合、名前の長さは64バイト以下である必要があります。SELECTリストとバインド記述子を割り当てた後 、プログラムは動的ステートメントを準備し、結果セット上にカーソルを宣言します。次に、プログラムは bindParams()関数を呼び出します。 bindParams()関数はバインド記述子( params )を調べ、動的クエリで見つかった各パラメーターマーカーの代わりに置き換える値をユーザーに求めます。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配列にエンコードするため、この手順が必要です。列の実際のデータ型をデコードした後、プログラムは結果記述子を変更して、ECPGPlusにNULL終了文字列の形式で各値を返すように指示します。記述子を変更する前に、プログラムは各値を保持するために必要なスペースの量を計算する必要があります。この計算を行うために、プログラムは各列の最大長( results->V[col] )および各列のデータ型( results->T[col] )を調べます 。数値の場合( 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->L[col]は、指定された列に対してフェッチされた値の長さが含まれます。最後に、 displayResultSet()は結果セットの各列を反復処理し、対応するNULLインジケーターを調べて、値を出力します。結果セットは整列されません-代わりに、各値はコンマによって前の値から分離されます。
6 エラー処理
•
•
6.1 sqlcaを使用したエラー処理sqlca (SQLコミュニケーションエリア)は、サーバーからクライアントアプリケーションに情報を伝達するためにecpglibによって使用されるグローバル変数です。 SQLステートメント(たとえば、 INSERTまたはSELECTステートメント)を実行した後、 sqlcaの内容を検査して、ステートメントが正常に完了したか、ステートメントが失敗したかを判断できます。sqlca構造は次のとおりです。Advanced Serverの sqlca構造には、次のメンバーが含まれています。sqlcaidにはストリング「 SQLCA"が含まれています。sqlcodeメンバーは、SQL 92で廃止されました。 Advanced Serverは下位互換性のためにsqlcodeをサポートしていますが、新しいコードを作成するときはsqlstateメンバーを使用する必要があります。sqlcodeは整数値です。正のsqlcode値は、クライアントアプリケーションが無害な処理条件に遭遇したことを示し、負の値は警告またはエラーを示します。ステートメントがエラーなしで処理される場合、 sqlcodeには値0が含まれます。クライアントアプリケーションでステートメントの実行中にエラー(または警告)が発生した場合、 sqlcodeには最後に返されたコードが含まれます。SQL標準では、 100 正の値のみが定義されています。これは、処理された最新のSQLステートメントが行を返さない/影響しないことを示します。標準SQLでは他のsqlcode値を定義していないため、各条件に割り当てられる値はデータベースごとに異なる可能性があることに注意してください。sqlerrmlは、現在sqlerrmc格納されているエラーメッセージの長さが含まれます。sqlerrmcは、 sqlstate格納されたコードに関連付けられたヌル終了メッセージテキストが含まれます。メッセージの長さが149文字を超える場合、 ecpglibはエラーメッセージを切り捨てます。sqlerrdは、6つの要素を含む配列です。sqlerrd[1]には、処理された行のOIDが含まれます(該当する場合)。sqlerrd[2]は、処理または返された行の数が含まれます。sqlwarnは、8文字を含む配列です。データ値がホスト変数に格納されたときに切り捨てられた場合、 sqlwarn[1]には値'W'が含まれます。クライアントアプリケーションが致命的でない警告を検出した場合、 sqlwarn[2]には値'W'が含まれます。sqlstateは、クライアントアプリケーションからステートメントを実行した後の SQL準拠のステータスコードを含む5文字の配列です。ステートメントがエラーなしで処理される場合、 sqlstateの値は00000ます。 sqlstateはnullで終わる文字列ではないことに注意してください。sqlstate コードは、階層スキームで割り当てられます。
•
• クライアントアプリケーションがSQLステートメントの実行中に複数のエラー(または警告)に遭遇した場合、 sqlstateには最後に返されたコードが含まれます。
The host variable (defined in the C code) is of type INT, and the selected data is of a type that cannot be converted into an INT. ecpglib uses the strtol() function to convert string values into numeric form. The host variable (defined in the C code) is an unsigned INT, and the selected data is of a type that cannot be converted into an unsigned INT. ecpglib uses the strtoul() function to convert string values into numeric form. The host variable (defined in the C code) is of type FLOAT, and the selected data is of a type that cannot be converted into an FLOAT. ecpglib uses the strtod() function to convert string values into numeric form.
コードは、クライアントアプリケーションが特定の条件を検出した場合に、指定されたアクションを実行するようにクライアントアプリケーションに指示します。 condition次のいずれかです。SQLERROR場合に、条件が存在sqlca.sqlcodeゼロ未満です。SQLWARNING場合に、条件が存在sqlca.sqlwarn[0]含まれている'W'.NOT FOUND条件が存在するとき、 sqlca 。 sqlcodeはECPG_NOT_FOUND (クエリがデータを返さない場合)。DO CONTINUEDO CONTINUE のアクションは 、出力されたCコードでCONTINUEステートメントを生成します。条件に遭遇すると、ループ内の残りのコードをスキップし、次の反復を続行します。ループ内でのみ使用できます。sqlprint()関数を使用して、エラーメッセージを標準エラー(標準エラー) に stderrます。 sqlprint()関数はsql error出力し、続いてsqlcaの内容を出力しsqlca 。 sqlerrm sqlerrmc 。exit(1)を呼び出してエラーを通知し、プログラムを終了します。注:クライアントアプリケーションが上から下に実行されない場合でも、ECPGPlusコンパイラはプログラムを上から下に処理します 。コンパイラ指令は各行に順番に適用され、コンパイラが別の指令に遭遇するまで有効です。
7 参照
•
•
7.1 Cプリプロセッサディレクティブ
• PROC モード
• では PROCモードで、ECPGPlusはあなたをすることができます:
• #if 式#ifdef symbolName#ifndef symbolName#elif 式#undef symbolName互換モードでECPGPlusを使用する場合は、使用することができます SELECT _ ERROR 収容することができますホスト変数よりも多くの行が含まれている結果セットを処理するために、どのようにあなたのプログラムを指示するプリコンパイラ・オプションを。構文は次のとおりです。デフォルト値は YES です。 結果セットがホスト変数の容量を超える場合 、 SELECT ステートメントはエラーメッセージを返します。 NO を 指定すると 、ホスト変数が対応できない行を SELECT ステートメントが返した ときにエラーメッセージを抑制するようにプログラムに指示します 。
•
7.2 サポートされているCデータ型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型を使用すると便利 です。
•
•
•
•
•
• Cでサポートされている数値型と文字型に加えて、 pgtypeslibランタイムライブラリは、日付/時刻と正確な数値を処理するためのカスタムデータ型(およびこれらの型を操作する関数)を提供します。
•
•
•
•
7.3 型コード次の表には、 外部データ型の型コードが含まれています。外部データ型は、Cホスト変数の型を示すために使用されます。アプリケーションが値をパラメーターにバインドするか、バッファーをSELECTリスト項目にバインドする場合、対応するSQLDA記述子のタイプコード( descriptor ->T[ column ] )を次のいずれかの値に設定する必要があります。
次の表には、 内部データ型の型コードが含まれています。内部型コードは、データベースに存在する値の型を示すために使用されます。 DESCRIBE SELECT LISTステートメントは、次の値を使用してデータ型配列( descriptor ->T[ column ] )を作成します。
7.4 SQLDA構造N - エントリの最大数N構造部材は、SQLDAが記述することができるエントリの最大数を含んでいます。このメンバーは、SQLDA構造を割り当てるときにsqlald()関数によって設定されます。 OPENまたはFETCHステートメントで記述子を使用する前に、 Nを説明されている値の実際の数に設定する必要があります。V - データ値V構造体は、データ値の配列へのポインタです。バインド記述子の場合、 Vはパラメーター値の配列を指します(記述子を使用するカーソルを開く前に、この配列に値を入力する必要があります)。アプリケーションは、各値を保持するために必要なスペースを割り当てる必要があります。 SELECTリスト値にスペースを割り当てる方法の例については、 displayResultSet()関数を参照してください ( セクション5.4 、不明な数の変数を使用したクエリの実行)。L - 各データ値の長さL構造部材は、長さの配列へのポインタです。この配列の各メンバーは、 V配列の対応するメンバーで使用可能なメモリの量を示す必要があります。たとえば、 V[5]が20バイトのNULL終了文字列を保持するのに十分な大きさのバッファを指している場合、 L[5]には値21(文字列の文字に20バイトとNULL-ターミネーター)。アプリケーションは、 L配列の各メンバーを設定する必要があります。T - データ型T記述子によって記述されたデータタイプ、各列(またはパラメータ)のための1つのアレイに構造部材ポイント。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()関数のシグネチャは次のとおりです。I - インジケーター変数I標識変数の配列に構造部材ポイント。 この配列は、アプリケーションが sqlald() 関数を 呼び出して記述子を割り当てるときに割り当てられます 。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で終了する文字列の配列に構造部材ポイント。バインド記述子の場合、 DESCRIBE BIND VARIABLESステートメントは、この配列の各メンバーを対応するバインド変数の名前に設定します。このリリースでは、各バインド変数の名前は、クエリ内のパラメーターマーカーの左から右の順序によって決定されます。たとえば、最初のパラメーターの名前は常に ?0で、2番目のパラメーターの名前は常に?1など。M - 列/パラメーター名の最大長Mの長さの配列に構造部材ポイント。この配列の各メンバーは、 S配列の対応するメンバーの最大長を指定します(つまり、 M[0]はS[0]で見つかった列/パラメーター名の最大長を指定します)。この配列は、 sqlald()関数によって設定されます。C - 実際の列/パラメーター名の長さC長さの配列に構造部材ポイント。この配列の各メンバーは、 S配列の対応するメンバーの実際の長さを指定します(つまり、 C[0]はS[0]で見つかった列/パラメーター名の実際の長さを指定します)。X - インジケーター変数名X NULLで終了する文字列の配列に構造部材ポイント-各文字列の対応する値のNULLインジケータの名前を表します。Y - インジケーター名の最大長Y構造部材は、長さの配列を指します。この配列の各メンバーは、 X配列の対応するメンバーの最大長を指定します(つまり、 Y[0]はX[0]で見つかったインジケーター名の最大長を指定します)。Z - 実際のインジケーター名の長さZ長さの配列に構造部材ポイント。この配列の各メンバーは、 X配列の対応するメンバーの実際の長さを指定します(つまり、 Z[0]は、 X[0]で見つかったインジケーター名の実際の長さを指定します)。
7.5 ECPGPlusステートメントAdvanced Server SQLステートメントをCプログラムに埋め込むことができます。各ステートメントはキーワード EXEC SQLで始まり、セミコロン( ; )で終わる必要があります。 Cプログラム内では、SQLステートメントは次の形式を取ります。どこ sql_command_body 、標準のSQL文を表します。ホスト変数は、SQLステートメントが値式を予期する任意の場所で使用できます。値式をホスト変数に置き換える方法の詳細については、 セクション3.1.2 、 ホスト変数の宣言 を参照してください 。ECPGPlusは、一部のステートメントのPostgreSQLサーバー側構文を拡張します。これらのステートメントの構文の違いについては、以下のリファレンスセクションで説明します。他のSQLコマンドでサポートされている構文の完全なリファレンスについては、次の場所にあるPostgreSQL Core Documentationを参照してください。
7.5.1 記述子の割り当てdescriptor_nameは、記述子の名前または記述子の名前を含むホスト変数です。この値は、識別子、引用符付き文字列リテラル、またはホスト変数の形式をとることがあります。
7.5.2 呼び出しCALLステートメントを使用して、サーバー上のプロシージャまたは関数を呼び出します。 CALLステートメントはAdvanced Serverでのみ機能します。 CALLステートメントには2つの形式があります。最初の形式は関数を呼び出すために使用されます:EXEC SQL CALL program _ name '('[ actual_arguments ]')'
INTO [[: ret _ variable ][: ret _ indicator ]];program_nameは、 CALLステートメントが呼び出すストアドプロシージャまたは関数の名前です。プログラム名は、スキーマ修飾またはパッケージ修飾(またはその両方)にすることができます。プログラムが存在するスキーマまたはパッケージを指定しない場合、ECPGPlusはsearch_pathの値を使用してプログラムを見つけます。actual_argumentsは、プログラムに必要な引数のコンマ区切りリストを指定します。各actual_argumentは、プログラムで予期される正式な引数に対応することに注意してください。各仮引数は、 INパラメーター、 OUTパラメーター、またはINOUTパラメーターです。: ret_variableは、プログラムが関数である場合に返される値を受け取るホスト変数を指定します。: ret_indicatorは、プログラムが関数である場合、返されるインジケーター値を受け取るホスト変数を指定します。
7.5.3 閉じるCLOSEステートメントを使用してカーソルを閉じ、カーソルが現在使用しているリソースをすべて解放します。クライアントアプリケーションは、閉じたカーソルから行をフェッチできません。 CLOSEステートメントの構文は次のとおりです。cursor_nameは、ステートメントによって閉じられたカーソルの名前です。カーソル名は、識別子またはホスト変数の形式をとることがあります。OPEN 文は、カーソルを初期化します。初期化されると、カーソルが再度開かない限り、カーソル結果セットは変更されません。 カーソルを再度開く前 に CLOSE 必要はありません 。
7.5.4 コミットCOMMITステートメントを使用して現在のトランザクションを完了し、すべての変更を永続化し、他のユーザーに見えるようにします。構文は次のとおりです。database_nameは、作業が存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。デフォルトでは、ステートメントは、クライアントアプリケーションが COMMIT ステートメントを 実行するときにのみコミットされます 。 ECPGPlusを呼び出すときに -t オプションを 含め て、クライアントアプリケーションが AUTOCOMMIT 機能 を呼び出すように指定し ます。 次のステートメントを使用して、クライアントアプリケーションの AUTOCOMMIT 機能を 制御することもでき ます。
7.5.5 CONNECTCONNECTステートメントを使用して、データベースへの接続を確立します。 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];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番目の形式の構文は次のとおりです。どこ credentials 、次のいずれかです。database_nameは、クライアントが接続しているデータベースの名前またはIDです。次のいずれかの形式で、 database_nameを変数または文字列リテラルとして指定しdatabase_name 。hostnameは、データベースが存在するサーバーの名前またはIPアドレスです。portは、サーバーがリッスンするポートです。DEFAULT 値を指定して、デフォルトのロール名を使用してデフォルトのデータベースとの接続を確立することもできます 。ターゲットデータベースとしてDEFAULTを指定する場合は、 connection_nameまたはcredentials含めないでください。connection_nameは、データベースへの接続の名前です。 connection_nameは、識別子の形式をとる必要があります(つまり、文字列リテラルまたは変数ではありません)。各接続に一意のconnection_nameを指定することにより、複数の接続を開くことができます。CURRENTは、最後に開かれた、または最新のSET CONNECTION TOステートメントで言及されたSET CONNECTION TOです。 EXEC SQLステートメントで名前で接続を参照しない場合、ECPGは接続の名前をCURRENTとCURRENTます。passwordは、指定されたuser_name関連付けられたパスワードです。
7.5.6 記述子の割り当て解除
7.5.7 DECLARE CURSOREXEC SQL [AT database_name ] DECLARE cursor_name CURSOR FOR ( select _ statement | statement _ name );database_nameは、カーソルが動作するデータベースの名前です。この値は、識別子またはホスト変数の形式をとることがあります。データベース名を指定しない場合、デフォルト値のdatabase_nameデフォルトのデータベースです。cursor_nameは、カーソルの名前です。statement_nameは、カーソル結果セットを定義するSQLステートメントまたはブロックの名前です。
7.5.8 DECLAREデータベースdatabase_nameは、データベースの名前を指定します。
7.5.9 DECLARE文DECLARE STATEMENTディレクティブを使用して 、SQLステートメントの識別子を宣言します。 Advanced Serverは、 DECLARE STATEMENTディレクティブの2つのバージョンをサポートしています。statement_nameは、ステートメントに関連付けられた識別子statement_name指定します。database_nameは、データベースの名前を指定します。この値は、識別子または識別子を含むホスト変数の形式をとることがあります。
7.5.10 削除DELETEステートメントを使用して 、テーブルから1つ以上の行を削除します。 ECPGPlus DELETEステートメントの構文はSQLステートメントの構文と同じですが、パラメーターマーカーとホスト変数は、式が許可されている任意の場所で使用できます。構文は次のとおりです。[WHERE condition | WHERE CURRENT OF cursor _ name ]
[{RETURNING|RETURN} * | output _ expression [[ AS] output _ name ] [, ...] INTO host_variable_list ]tableは、既存のテーブルの名前(オプションでスキーマ修飾)です。 ONLY句を含めて、処理を指定されたテーブルに制限します。 ONLY句を含めない場合、名前付きテーブルから継承するテーブルも処理されます。aliasは、ターゲットテーブルの代替名です。using_listはテーブル式のリストであり、他のテーブルの列をWHERE条件に表示できます。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句から対応する値を受け取ります。DELETEステートメントの使用の詳細については、次の場所にあるPostgreSQL Coreドキュメントを参照してください。
7.5.11 DESCRIBEDESCRIBEステートメントを使用して 、準備済みステートメントで必要な入力値の数、または準備済みステートメントで返される出力値の数を見つけます。 DESCRIBEステートメントは、アプリケーションの作成時に形状が不明なSQLステートメントを分析するために使用されます。DESCRIBE文は移入SQLDA記述を、 SQL記述子を移入するには、 ALLOCATE DESCRIPTORおよびDESCRIBE…DESCRIPTOR文を使用します。descriptorは、 SQLDA*型のC変数の名前です。 DESCRIBEステートメントを実行する前に、 sqlald()呼び出して(および記述子を初期化してsqlald()記述子のスペースを割り当てる必要があります。empテーブルから情報を返すクエリを準備できます。ステートメントを実行する 前に 、各入力値の変数と各出力値の変数をバインドする必要があります。入力値にバインドする変数は、ステートメントで使用される実際の値を指定します。出力値にバインドする変数は、ステートメントの実行時に値を配置する場所をECPGPlusに指示します。
7.5.12 DESCRIBE DESCRIPTOR使用 DESCRIBE DESCRIPTOR SQL文に関する情報を取得し、SQL記述子にその情報を格納するためのステートメントを。 DESCRIBE DESCRIPTORを使用する前に、 ALLOCATE DESCRIPTORステートメントで記述子を割り当てる必要があります。構文は次のとおりです。EXEC SQL DESCRIBE [INPUT | OUTPUT] statement _ identifier
USING [SQL] DESCRIPTOR descriptor _ name ;statement_nameは、準備されたSQLステートメントの名前です。empテーブルから情報を返すクエリを準備できます。
7.5.13 切断DISCONNECTステートメントを使用して、サーバーへの接続を閉じます。構文は次のとおりです。connection_nameは、接続の確立に使用されるCONNECTステートメントで指定された接続名です。接続名を指定しない場合、現在の接続は閉じられます。CURRENTキーワードを含めて、 ECPGPlusが最近使用した接続を閉じるように指定します。DEFAULTキーワードを含めて、 ECPGPlusがDEFAULTという名前の接続を閉じるように指定します。接続を開くときに名前を指定しない場合、ECPGPlusは接続に名前DEFAULT割り当てます。ALLキーワードを含めて、アクティブな接続をすべて閉じるようにECPGPlusに指示します。
7.5.14 EXECUTEEXEC SQL [FOR array _ size ] EXECUTE statement _ name
[USING {DESCRIPTOR SQLDA_descriptor
|: host_variable [[INDICATOR] : indicator_variable ]}];USING句を含めて 、準備されたステートメント内のパラメーターの値を指定します。
7.5.15 EXECUTE DESCRIPTOREXEC SQL [FOR array_size ] EXECUTE statement_identifier
[USING [SQL] DESCRIPTOR descriptor_name ]
[INTO [SQL] DESCRIPTOR descriptor _ name ];USING句を含めて 、準備されたステートメントに必要な入力パラメーターの値を指定します。descriptor_nameは、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。
7.5.16 EXECUTE ... END EXECEXECUTE…END-EXECステートメントを使用して 、匿名ブロックをクライアントアプリケーションに埋め込みます。構文は次のとおりです。database_nameは、データベース識別子またはデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースで実行されます。anonymous_blockは、PL / pgSQLまたはSPLステートメントと宣言のインラインシーケンスです。ブロック内にホスト変数とオプションのインジケータ変数を含めることができます。そのような各変数は、 IN/OUT値として扱われます。
7.5.17 IMMEDIATE EXECUTEdatabase_nameは、データベース識別子またはデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースで実行されます。この動的SQLステートメントは、SQLステートメントのテキストがわからない場合(クライアントアプリケーションを作成する場合など)に便利です。たとえば、クライアントアプリケーションは、実行するステートメントを(信頼できる)ユーザーに要求する場合があります。ユーザーが文のテキストを文字列値として提供した後、 EXECUTE IMMEDIATEコマンドを使用して文が実行されます。ステートメントテキストには、ホスト変数への参照を含めることはできません。ステートメントにパラメーターマーカーが含まれているか、1つ以上の値を返す場合は、 PREPAREおよびDESCRIBEステートメントを使用する必要があり PREPARE 。
7.5.18 FETCHFETCHステートメントを使用して 、カーソルからSQLDA記述子またはホスト変数のターゲットリストに行を返します。 FETCHステートメントを使用してカーソルから情報を取得する前に、 DECLAREおよびOPENステートメントを使用してカーソルを準備する必要があります。ステートメントの構文は次のとおりです。cursorは、行をフェッチするカーソルの名前、またはカーソルの名前を含むホスト変数です。
7.5.19 FETCH DESCRIPTORcursorは、行のフェッチ元のカーソルの名前、またはカーソルの名前を含むホスト変数です。クライアントは、 FETCH DESCRIPTORステートメントを呼び出す前に、カーソルをDECLAREおよびOPENする必要があります。INTO 句を 含めて 、準備されたステートメントによって返された結果を EXECUTE ステートメントが書き込む SQL記述子を指定します 。 descriptor_name は、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。使用する前に、 ALLOCATE を使用して記述子を割り当てる必要があります DESCRIPTOR ステートメント。次の例では、結果セット内の特定の行の説明と値を保持するrow_descという名前の記述子を割り当てます。次に、結果セットの行をループする前に、 FETCHを使用してカーソルから次の行を記述子に取得する前に、準備済みステートメント( my_cursor )のカーソルを宣言して開きます。
7.5.20 GETのDESCRIPTOREXEC 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は、取得した記述子項目のタイプを指定します。
•
•
•
•
•
• この例では、SQL記述子( parse_desc という parse_desc )を割り当ててから、 PREPAREステートメントを使用して、ユーザーが提供した文字列を構文チェックします( :stmt )。 DESCRIBEステートメントは、ユーザーが指定した文字列を記述子parse_desc移動します。 EXEC SQL GET DESCRIPTORの呼び出しは、記述子に問い合わせて、結果セット内の列数( :col_count )を検出します。
7.5.21 挿入INSERTステートメントを使用して、 1つ以上の行をテーブルに追加します。 ECPGPlusのINSERTステートメントの構文はSQLステートメントの構文と同じですが、値が許可される場所であればどこでもパラメーターマーカーとホスト変数を使用できます。構文は次のとおりです。tableは、既存のテーブルの(オプションでスキーマ修飾された)名前を指定します。expressionは、対応する列に割り当てられる式、値、ホスト変数、またはパラメーターマーカーです。 DEFAULTを指定すると、対応する列にデフォルト値が入力されます。output_expressionは、各行が挿入された後にINSERTコマンドによって計算されて返される式です。式は、テーブル内の任意の列を参照できます。 *を指定すると、挿入された行のすべての列が返されます。output_nameは、返される列に使用する名前を指定します。INSERTステートメントの使用の詳細については、次の場所にあるPostgreSQL Coreドキュメントを参照してください。
7.5.22 OPENOPENステートメントを使用して、カーソルを開きます。構文は次のとおりです。どこ parameters 、次のいずれかです。cursorは、開かれているカーソルの名前です。parametersは、 DESCRIPTOR SQLDA _ descriptorまたはカーソルを初期化するホスト変数(およびオプションのインジケーター変数)のコンマ区切りリストです。 SQLDA_descriptor指定する場合、記述子はDESCRIBEステートメントで初期化する必要があります。OPEN 文はで提供された値使用してカーソルを初期化 parameters 。初期化されると、カーソルを閉じて再度開かない限り、カーソル結果セットは変更されません。アプリケーションが終了すると、カーソルは自動的に閉じられます。次の例で は、 emp テーブル を照会する employees という名前のカーソルを宣言し、名前がユーザー指定の値(ホスト変数:emp_name格納されている)と一致する従業員の従業員番号、名前、給与および歩合を返します。カーソルを宣言した後、この例では OPENステートメントを使用して、カーソルの内容をクライアントアプリケーションで使用できるようにします。
7.5.23 オープン記述子EXEC SQL [FOR array _ size ] OPEN cursor
[USING [SQL] DESCRIPTOR descriptor _ name ]
[INTO [SQL] DESCRIPTOR descriptor _ name ];cursorは、開かれているカーソルの名前です。descriptor_nameは、SQL記述子の名前(単一引用符で囲まれた文字列リテラルの形式)またはカーソルを初期化するクエリを含むSQL記述子の名前を含むホスト変数を指定します。
7.5.24 PREPAREPREPAREステートメントを使用して 、SQLステートメントまたはPL / pgSQLブロックを実行用に準備します。このステートメントには2つの形式があります。最初の形式は次のとおりです。database_nameは、データベース識別子、またはステートメントが実行されるデータベース識別子を含むホスト変数です。 AT句を省略すると、 ステートメントは現在のデフォルトデータベースに対して実行されます。statement_name は、準備されたSQLステートメントまたはPL / SQLブロックに関連付けられた識別子です。準備されたステートメント内に変数を含めるには 、ステートメント を PREPARE する ときに変更される可能性のあるステートメント値を プレースホルダー( $1 、 $2 、 $3 など) に置き換え ます 。あなたはときに EXECUTE 文を、各パラメータの値を提供します。値は、プレースホルダーを置き換える順序で提供する必要があります。注:クライアントアプリケーションは 、ステートメントが実行される各セッション内で PREPARE ステートメントを 発行する必要 があります。準備されたステートメントは、現在のセッションの間だけ持続します。
7.5.25 ROLLBACKROLLBACKステートメントを使用して 、現在のトランザクションを中止し、トランザクションによって行われた更新を破棄します。構文は次のとおりです。database_nameは、データベース識別子、またはステートメントが実行されるデータベース識別子を含むホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースに対して実行されます。指定されたsavepoint後に実行されたコマンドを中止するには、 TO句を含めます 。 SAVEPOINTステートメントを使用して、 savepointを定義します。 TO句を省略すると、 ROLLBACKステートメントはトランザクションを中止し、すべての更新を破棄します。このステートメントを呼び出すと、トランザクションが中止され、すべての変更が取り消され、セーブポイントが消去され、すべてのトランザクションロックが解除されます。セーブポイントを含める場合(次の例ではmy_savepoint ):my_savepoint 後に発生したトランザクションの部分のみがロールバックされます。 my_savepointは保持されmy_savepointが、 my_savepoint後に作成されたセーブポイントは消去されます。
7.5.26 SAVEPOINT使用 SAVEPOINT セーブポイントを定義する文を、セーブポイントは、トランザクション内のマーカーです。 ROLLBACKステートメントを使用して現在のトランザクションを中止し、サーバーの状態を指定されたセーブポイントの前の状態に戻すことができます。 SAVEPOINTステートメントの構文は次のとおりです。database_nameは、セーブポイントが存在するデータベース識別子を含むデータベース識別子またはホスト変数です。 AT句を省略すると、ステートメントは現在のデフォルトデータベースに対して実行されます。my_savepoint という名前のセーブポイントを作成するには、次のステートメントを含めます。
7.5.27 SELECTECPGPlusは 、 INTO host_variables句を提供することにより、SQL SELECTステートメントのサポートを拡張します 。この句により、指定された情報をAdvanced Serverデータベースからホスト変数に選択できます。 SELECTステートメントの構文は次のとおりです。[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]database_nameは、テーブルが存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。host_variablesは、 SELECTステートメントによって入力されるホスト変数のリストです。 SELECTステートメントが複数の行を返す場合、 host_variablesは配列でなければなりません。INTO host_variables句を使用するには、 SELECTステートメントを指定するときに、定義済みのホスト変数の名前を含めます。たとえば、次のSELECTステートメントは、 :emp_nameおよび:emp_salホスト変数に従業員名と給与のリストを入力します。
7.5.28 接続の設定connection_nameは、データベースへの接続の名前です。SET CONNECTIONステートメントを使用するには、 CONNECTステートメントの2番目の形式を使用してデータベースへの接続を開く必要があります。 connection_nameを指定するAS句を含めます。デフォルトでは、現在のスレッドは現在の接続を使用します。 SET 使用する 使用する現在のスレッドのデフォルト接続を指定する CONNECTION ステートメント。デフォルト接続は、 EXEC を実行するときにのみ使用されます 接続名を明示的に指定しない SQL ステートメント。たとえば、次のステートメントでは、 AT connection _ name 句が 含まれていないため、デフォルトの接続が使用されます 。 :サーバーは、接続クライアントが使用できる特権を決定するときに、接続に関連付けられた特権を使用します。 acctg_conn 接続 を使用する場合 、クライアントはロール alice 関連付けられた特権を持ち ます。 hr_conn を使用して接続する と、クライアントは bob 関連付けられた権限を持ちます 。
7.5.29 SET DESCRIPTORホスト変数または整数値の形式でクライアントアプリケーションから提供される情報を使用して、記述子領域に値を割り当てるには、 SET DESCRIPTORステートメントを使用します。ステートメントには2つの形式があります。最初の形式は次のとおりです。EXEC SQL [FOR array _ size ] SET DESCRIPTOR descriptor _ name
VALUE column_number descriptor _ item = host _ variable ;descriptor_nameは、記述子の名前(単一引用符で囲まれた文字列リテラルとして)、または記述子の名前を含むホスト変数を指定します。VALUE句を含めて 、記述子に格納されている情報を記述します。column_numberは、記述子内の変数の位置を識別します。descriptor_itemは、記述子項目のタイプを指定します。host_variableは、アイテムの値を含むホスト変数の名前を指定します。
•
• たとえば 、クライアントアプリケーションは、動的に作成されたクエリの入力をユーザーに求める場合があります。動的に作成されたクエリを実行するには、最初 にクエリを 準備 し(クエリの構文の解析と検証)、次に EXEC を使用してクエリで見つかっ た 入力 パラメータを 記述 する 必要があり ます。 SQL DESCRIBE INPUT ステートメント。クエリを記述した後、 query_params記述子には、クエリに必要な各パラメーターに関する情報が含まれます。次に、 EXEC SQL GET DESCRIPTORを使用して、各パラメーターの名前を取得できます。また、 EXEC SQL GET DESCRIPTORを使用して、記述子から各パラメーターのタイプ(パラメーターの数とともに)を取得することも、文字ストリングの形式で各値を指定することもでき、ECPGはそのストリングを必要なデータに変換しますタイプ。次に、各パラメーターをループして、ユーザーに値を入力するように求め、それらの値をホスト変数に保存します。あなたは使用することができ GET DESCRIPTOR … COUNTクエリ内のパラメータの数を見つけること。
7.5.30 更新UPDATEステートメントを使用して、テーブルに保存されているデータを変更します。構文は次のとおりです。[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [[ AS ] output_name ] [, ...] ]database_nameは、テーブルが存在するデータベース(またはデータベースの名前を含むホスト変数)の名前です。この値は、引用符で囲まれていない文字列リテラルまたはホスト変数の形式をとることがあります。次の UPDATEステートメントは、従業員( :enameホスト変数で識別される)のジョブ記述を:new_jobホスト変数に含まれる値に変更し、現在の給与に:increaseホストの値を掛けることにより従業員の給与を:increaseます。変数:拡張された UPDATEステートメントでは、入力値が許可される句にパラメーターマーカー(疑問符)を含めることもできます。たとえば、 WHERE句にパラメーターマーカーを使用して同じ更新ステートメントを記述できます。
7.5.31 WHENEVERWHENEVERステートメントを使用して 、クライアントアプリケーションがSQLエラーまたは警告を検出したときに実行するアクションを指定します。構文は次のとおりです。
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.
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.