ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

SQLCAおよびSQLSTATEの詳細は、付録Cを参照してください。

## 例

> 例1: PL/Iプログラムでの埋込みFETCH文の使用

> このプログラムの一部では、埋め込まれたDECLARE CURSOR文、OPEN文およびFETCH文を使用し、マネージャの名前と部門を取得および出力します。FETCH文では、結果表の行をフェッチしてパラメータ:FNAME、:LNAMEおよび:DNAMEに保存します。

>     /* Declare the parameters: */
>     BEGIN DECLARE SECTION

>     DCL ID          CHAR(3);
>     DCL FNAME       CHAR(10);
>     DCL LNAME       CHAR(14);

>     END DECLARE SECTION

>     /* Declare the cursor: */
>     EXEC SQL DECLARE MANAGER CURSOR FOR
>             SELECT E.FIRST_NAME, E.LAST_NAME, D.DEPARTMENT_NAME
>                     FROM EMPLOYEES E, DEPARTMENTS D
>                     WHERE E.EMPLOYEE_ID = D.MANAGER_ID ;

>     /* Open the cursor: */
>     EXEC SQL OPEN MANAGER;

>     /* Start a loop to process the rows of the cursor: */
>     DO WHILE (SQLCODE = 0);
>             /* Retrieve the rows of the cursor
>             and put the value in parameters: */
>             EXEC SQL FETCH MANAGER INTO :FNAME, :LNAME, :DNAME;
>             /* Print the values in the parameters: */
>                             .
>                             .
>                             .
>     END;

>     /* Close the cursor: */
>     EXEC SQL CLOSE MANAGER;

> 例2: FETCH文を使用したデータ型LISTの列のセグメントの表示

> この対話型の例では、表カーソルを使用して、RESUMES表からのリストを含む行を取得します。OPEN文でRESUME列にあるリストの最初のセグメントにカーソルを配置し、以降のFETCH文でそのリストの後続のセグメントを取得します。

>     SQL> DECLARE TBLCURSOR2 CURSOR FOR SELECT EMPLOYEE_ID, RESUME
>     cont> FROM RESUMES;
>     SQL> DECLARE LSTCURSOR2 LIST CURSOR FOR SELECT RESUME
>     cont> WHERE CURRENT OF TBLCURSOR2;
>     SQL> OPEN TBLCURSOR2;
>     SQL> FETCH TBLCURSOR2;
>       00164
>     SQL> OPEN LSTCURSOR2;
>     SQL> FETCH LSTCURSOR2;
>      RESUME
>      This is the resume for 00164
>     SQL> FETCH LSTCURSOR2;
>      RESUME
>      Boston, MA
>     SQL> FETCH LSTCURSOR2;
>      RESUME
>      Oracle Corporation
>     SQL> FETCH LSTCURSOR2;
>      RESUME
>     %RDB-E-STREAM_EOF, attempt to fetch past end of record stream
>     SQL> CLOSE LSTCURSOR2;
>     SQL> SELECT * FROM RESUMES;
>       EMPLOYEE_ID    RESUME
>      00164                     72:2:3
>     1 row selected
>     SQL> CLOSE TBLCURSOR2;
>     SQL> COMMIT;

> 例3: スクロール可能なリスト・カーソルを使用したリスト・データのフェッチ

> このCプログラムでは、FETCH文による、スクロール可能なリスト・カーソルを使用した、サンプルの人事データベースからのリスト・データの読取りを示しています。読み取られるリスト・データは、人事のRESUMES表のRESUME列のものです。RESUMEは、次の順序で3つのセグメントに分割されています。

> 1. 従業員の名前を含む行: This is the resume for Alvin Toliver

> 2. 従業員の住所を示す行: Boston, MA

> 3. 従業員の勤務先を示す行: Oracle Corporation

>     #include stdio
>     #include descrip

>     /* Declare parameters for error handling by including the SQLCA. */

>     EXEC SQL INCLUDE SQLCA;

>     /* Error-handling section. */

>     dump_error( )
>     {

>     short           errbuflen;
>     char            errbuf[ 1024 ];
>     struct          dsc$descriptor_s    errbufdsc;

>     errbufdsc.dsc$b_class = DSC$K_CLASS_S;
>     errbufdsc.dsc$b_dtype = DSC$K_DTYPE_T;
>     errbufdsc.dsc$w_length = 1024;
>     errbufdsc.dsc$a_pointer = &errbuf;

>         if (SQLCA.SQLCODE != 0)
>         {
>             printf( "SQLCODE = %d\n", SQLCA.SQLCODE );
>            SQL$GET_ERROR_TEXT( &errbufdsc, &errbuflen );
>          errbuf[ errbuflen ] = 0;
>          printf("%s\n", &errbuf );
>         }
>     }
>     main()
>     {

>     /* Attach to the personnel database. */

>     EXEC SQL DECLARE ALIAS FILENAME personnel;

>     /* Declare variables. */

>     short two_s;

>     long  two_l;

>     char    blob[8];
>     char    emp_id[6];
>     char    seg2[ 81 ];

>     /* Declare a table cursor. */

>         exec sql declare resumes_cursor table cursor for
>         select employee_id, resume from resumes where employee_id = '00164';

>     /* Declare a read-only scrollable list cursor to fetch the RESUME column. */

>         exec sql declare resume_list_cursor read only scrollable list cursor for
>         select resume where current of resumes_cursor;

>     /* Open the table cursor. */

>         exec sql open resumes_cursor;
>         dump_error();

>     /* Place the first value in the table cursor (00164) into the emp_id parameter,
>     and the resume data into the blob parameter. */

>         exec sql fetch resumes_cursor into :emp_id, :blob;
>         dump_error();

>     /* Open the scrollable list cursor. */

>     exec sql open resume_list_cursor;
>     dump_error();

>     /*  Begin to use the FETCH statement to read desired lines from the resume.
>         If an attempt is made to retrieve a segment that is out of range, the
>         program prints an error message.
>     */

>     exec sql fetch last from resume_list_cursor into :seg2;
>     printf("FETCH LAST segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch next from resume_list_cursor into :seg2;
>     printf("FETCH NEXT segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch first from resume_list_cursor into :seg2;
>     printf("FETCH FIRST segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch next from resume_list_cursor into :seg2;
>     printf("FETCH NEXT segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch next from resume_list_cursor into :seg2;
>     printf("FETCH NEXT segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch relative -2 from resume_list_cursor into :seg2;
>     printf("FETCH RELATIVE -2 segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch first from resume_list_cursor into :seg2;
>     printf("FETCH FIRST segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch relative 2 from resume_list_cursor into :seg2;
>     printf("FETCH RELATIVE 2 segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch last from resume_list_cursor into :seg2;
>     printf("FETCH LAST segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch prior from resume_list_cursor into :seg2;
>     printf("FETCH PRIOR segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch ABSOLUTE 1 from resume_list_cursor into :seg2;
>     printf("FETCH ABSOLUTE 1 segment returned: %s\n", seg2 );
>     dump_error();

>     exec sql fetch relative 2 from resume_list_cursor into :seg2;
>     printf("FETCH RELATIVE 2 segment returned: %s\n", seg2 );
>     dump_error();

>     two_s = 2;
>     exec sql fetch ABSOLUTE :two_s from resume_list_cursor into :seg2;
>     printf("FETCH ABSOLUTE :two_s segment returned: %s\n", seg2 );
>     dump_error();

>     two_l = 2;
>     exec sql fetch ABSOLUTE :two_l from resume_list_cursor into :seg2;
>     printf("FETCH ABSOLUTE :two_1 segment returned: %s\n", seg2 );
>     dump_error();

>         exec sql fetch RELATIVE :two_l from resume_list_cursor into :seg2;
>         printf("FETCH RELATIVE :two_1 segment returned: %s\n", seg2 );
>         dump_error();

>         exec sql rollback;
>     }

> 次の例は、プログラムからの出力を示しています。

>     FETCH LAST segment returned: Oracle Corporation
>     FETCH NEXT segment returned: Oracle Corporation
>     SQLCODE = 100
>     %SQL-W-NOTFOUND, No rows were found for this statement
>     FETCH FIRST segment returned: This is the resume for Alvin Toliver
>     FETCH NEXT segment returned: Boston, MA
>     FETCH NEXT segment returned: Oracle Corporation
>     FETCH RELATIVE -2 segment returned: This is the resume for Alvin Toliver
>     FETCH FIRST segment returned: This is the resume for Alvin Toliver
>     FETCH RELATIVE 2 segment returned: Oracle Corporation
>     FETCH LAST segment returned: Oracle Corporation
>     FETCH PRIOR segment returned: Boston, MA
>     FETCH ABSOLUTE 1 segment returned: This is the resume for Alvin Toliver
>     FETCH RELATIVE 2 segment returned: Oracle Corporation
>     FETCH ABSOLUTE :two_s segment returned: Boston, MA
>     FETCH ABSOLUTE :two_1 segment returned: Boston, MA
>     FETCH RELATIVE :two_1 segment returned: Boston, MA
>     SQLCODE = -1
>     %RDB-F-SEGSTR_EOF, attempt to fetch past the end of a segmented string
>     -RDMS-E-FETRELATIVE, fetch relative (2) causes reference out of range 1..3

# FOR制御文

> 問合せ式の各行のSQL文を実行します。

## 環境

> 複数文プロシージャの複合文のFOR制御文は、次の環境で使用できます。

> - 対話型SQL内

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - SQLモジュールのプロシージャの一部として

> - 動的SQLで動的に実行される文として

## 形式

## 引数

> ### AS EACH ROW OF for-statement-table-cursor

> 指定したカーソルの結果表を作成します。

> オプションのカーソルの名前付けによって、FORループのDO句で配置したデータ操作言語文を使用できます。

> ### AS EACH ROW OF select-expression

> 簡易結果表を作成します。

> SQLで選択式から結果表が作成されると、DO句が各結果表の行について一連のSQL文（compound-use-statement）を実行します。

> ### beginning-label:

> 名前をFOR文に割り当てます。

> 名前付きFORループは、ラベル付きFORループ文と呼ばれます。終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと同じである必要があります。開始ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。

> ### DO compound-use-statement

> 選択式の結果表の各行について、SQL文のブロックを実行します。

> ### END FOR ending-label

> FORループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。

> オプションのend-label引数により、特に非常に複雑なプロシージャ・ブロックの場合の、複数文プロシージャにおけるFORループが読みやすくなります。

> ### FOR variable-name

> FORループ選択式の各指定列のフィールドを構成するレコードの名前を指定します。レコードの各フィールドには、選択式の結果表の各行の列名ごとに表されるデータが含まれています。

> 変数名によりcompound-use-statement引数（variable-name.column-nameなど）のフィールドを参照できます。

## 使用方法

> - ITERATE文とともに開始ラベルを使用すると、ループ本体のコマンドをスキップして、ループの次の反復を開始できます。

> - カーソル名は組み込むモジュール内で一意である必要があります。

> - カーソル名の参照は、FOR文の内部でのみ有効です。

> - 変数はFOR文の開始時点で作成され、FOR文の終了時点で破棄されます。

> - FORカーソル・ループは、行セットからフェッチされた行ごとにループのDO ... END FOR本体を実行します。行を処理せずにFORループが行セットの終端に到達したかどうかを判断する場合は、RETURNED_SQLCODEまたはRETURNED_SQLSTATEは使用できません。処理された行がゼロかそれ以上かをテストするには、END FOR句の後にGET DIAGNOSTICS ROW_COUNT文を使用する必要があります。

## 例

> 例1: SQLモジュール・プロシージャ内でのFOR文の使用

>     SQL> set flags 'trace';
>     SQL>
>     SQL> create module REPORTS
>     cont> /*
>     ***> This procedure counts the employees of a given state
>     ***> who have had a decrease in their salary during their
>     ***> employment
>     ***> */
>     cont> procedure COUNT_DECREASED
>     cont>     (in :state CHAR(2)
>     cont>     ,inout :n_decreased INTEGER);
>     cont> begin
>     cont> set :n_decreased = 0;
>     cont>
>     cont> EMP_LOOP:
>     cont> for :empfor
>     cont>     as each row of
>     cont>         select employee_id
>     cont>          from EMPLOYEES where state = :state
>     cont> do
>     cont>     begin
>     cont>     declare :last_salary INTEGER (2) default 0;
>     cont>
>     cont>     HISTORY_LOOP:
>     cont>     for :salfor
>     cont>         as each row of
>     cont>             select salary_amount
>     cont>              from SALARY_HISTORY
>     cont>              where employee_id = :empfor.employee_id
>     cont>              order by salary_start
>     cont>     do
>     cont>         if :salfor.salary_amount < :last_salary
>     cont>         then
>     cont>             set :n_decreased = :n_decreased + 1;
>     cont>             trace :empfor.employee_id, ': ', :salfor.salary_amount;
>     cont>             leave HISTORY_LOOP;
>     cont>         end if;
>     cont>
>     cont>         set :last_salary = :salfor.salary_amount;
>     cont>     end for;
>     cont>     end;
>     cont> end for;
>     cont> end;
>     cont>
>     cont> end module;
>     SQL>
>     SQL> declare :n integer;
>     SQL> call COUNT_DECREASED ('NH', :n);
>     ~Xt: 00200: 40789.00
>     ~Xt: 00248: 46000.00
>     ~Xt: 00471: 52000.00
>                N
>                3
>     SQL>
>     SQL> rollback;

# FOR（カウント）制御文

> SQL文のブロックは、FORループ変数がユーザー指定の開始値からユーザー指定の終了値に増減する間で実行します。

## 環境

> 複数文プロシージャの複合文のFORカウント制御文は、次の環境で使用できます。

> - 対話型SQL内

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - SQLモジュールのプロシージャの一部として

> - 動的SQLで動的に実行される文として

## 形式

## 引数

> ### AS EACH ROW OF select-expression

> 簡易結果表を作成します。

> SQLで選択式から結果表が作成されると、DO句が各結果表の行について一連のSQL文（compound-use-statement）を実行します。選択式の詳細は、第2.8.1項を参照してください。

> ### beginning-label:

> 名前をFOR文に割り当てます。名前付きFORループは、ラベル付きFORループ文と呼ばれます。終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと同じである必要があります。開始ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。

> ### compound-use-statement

> 複合文ブロックで許可されたSQL文を識別します。複合文の詳細は、「複合文」を参照してください。

> ### DO compound-use-statement

> 開始および終了のそれぞれの値式に定義されたように、ループの実行ごとにSQL文のブロックを1回実行します。

> ### END FOR

> ### END FOR ending-label

> FORループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。オプションのend-label引数により、特に非常に複雑なプロシージャ・ブロックの場合の、複数文プロシージャにおけるFORループが読みやすくなります。

> ### FOR variable-name

> FORループが実行されるたびに増分する値を保持する変数を指定します。REVERSEキーワードが指定されている場合は、変数は減少します。変数の開始値は最初の値式です。変数が第2の値式で指定された値に増減すると、FORループの実行は終了します。FORループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。オプションのend-label引数により、特に非常に複雑なプロシージャ・ブロックの場合の、複数文プロシージャにおけるFORループが読みやすくなります。

> ### IN value-expr TO value-expr

> ### IN REVERSE value-expr TO value-expr

> compound-use-statementの実行頻度を指定します。REVERSEキーワードが指定されていない場合、FOR variable-nameに含まれている変数は、FORループ本体の実行の終了ごとに増分します。REVERSEキーワードが指定されている場合、FOR variable-nameに含まれている変数は、FORループ本体の実行の終了ごとに減少します。

> 両方の値式は、ループの実行前に1回評価されます。TO value-expressionが最初に評価され、FORループ変数の参照が副次的な影響を及ぼさないことが確認されます。

> ### 選択式

> 選択式の詳細は、第2.8.1項を参照してください。

> ### STEP value-expr

> ループ反復の間の増分サイズを制御します。ステップ・サイズは数値式を使用して指定します。

> 省略された場合、デフォルトのステップ・サイズは1です。

>     SQL> begin
>     cont> declare :i integer;
>     cont> for :i in 1 to 20 step 5
>     cont> do
>     cont>     trace :i;
>     cont> end for;
>     cont> end;
>     ~Xt: 1
>     ~Xt: 6
>     ~Xt: 11
>     ~Xt: 16

> 注意 ループ制御変数がINTERVAL型の場合でも、STEPは数値型である必要があります。また値はゼロより大きくする必要があります。ループ制御変数を減少するには、REVERSEキーワードを使用します。

> ### value-expr

> 構文:

> > IN value-expr TO value-expr
> > IN REVERSE value-expr TO value-expr

> compound-use-statementの実行頻度を指定します。REVERSEキーワードが指定されていない場合、FOR variable-nameに含まれている変数は、FORループ本体の実行の終了ごとに増分します。REVERSEキーワードが指定されている場合、FOR variable-nameに含まれている変数は、FORループ本体の実行の終了ごとに減少します。

> 両方の値式は、ループの実行前に1回評価されます。TO value-expressionが最初に評価され、FORループ変数の参照が副次的な影響を及ぼさないことが確認されます。

## 使用方法

> - LEAVE文とともに開始ラベルを使用することにより、FORループの終了を制御できます。

> - FOR loop variable-nameが宣言された更新可能ローカル（グローバル）変数として存在している必要があります。

> - FORループ変数は小数部分のない数値（TINYINT、SMALLINT、INTEGER、BIGINT、FLOAT、REAL、DOUBLE、NUMERIC、NUMBERまたはDECIMAL）として宣言できます。
>   次のINTERVALデータ型もこのタイプのFORループとして有効です。

>   - INTERVAL YEAR

>   - INTERVAL MONTH

>   - INTERVAL DAY

>   - INTERVAL HOUR

>   - INTERVAL MINUTE

>   - INTERVAL SECOND

>   INTERVALを使用する場合、初期値と最終値は同じ型である必要があります。つまり、式はループ変数と同じデータ型である必要があります。

> - FORループの本体内では、FOR loop variable-nameは、次のいずれを使用しても更新できません。

>   - SET文

>   - GET DIAGNOSTICS文

>   - INSERT RETURNING文、UPDATE RETURNING文またはSELECT文のINTO句

>   また、FORループ変数名は、CALL文のINOUTパラメータまたはOUTパラメータのターゲットである場合は変更できません。
>   つまり、FORループ変数はループ内の定数変数として動作します。ただし、ループ外では、ループ変数の読取り専用の特性は一時的なものであるため、この変数を変更できます。

> - ループ本体は、次のいずれかに該当する場合は実行されません。

>   - 開始の値式がNULLに評価される場合。

>   - 終了の値式がNULLに評価される場合。

>   - フォワード・ループ（REVERSEキーワードを含まないループ）で開始の値式が終了の値式より大きい場合。

>   - ループ変数が数値のとき、値式が互換性のあるいずれかの数値データ型になる場合。たとえば、浮動小数点やスケール数値を使用できる場合。

>   - リバース・ループ（REVERSEキーワードを含むループ）で開始の値式が終了の値式より小さい場合。

> - FORループでは、最初の値式と最後の値式の間のセパレータとしてキーワードTOを使用します。この同じキーワードを使用して時間隔修飾子のフィールド名を区切ります。このため、外観が整形されている式を使用している場合に、あいまいさが生じることがあります。

>       SQL> begin
>       cont> declare :i interval year;
>       cont> for :i in interval'1' year to interval'4'year
>       for :i in interval'1' year to interval'4'year
>                                     ^
>       %SQL-W-LOOK_FOR_STT, Syntax error, looking for:
>       %SQL-W-LOOK_FOR_CON,            MONTH,
>       %SQL-F-LOOK_FOR_FIN,    found INTERVAL instead

>   これは、TOセパレータがINTERVALリテラルまたは式の一部として解釈されるために生じます。時間隔修飾子で終了する場合は、プログラマは最初の式をカッコで囲み、このあいまいさを回避する必要があります。

> - STEP値式は、ループ変数に値を代入する前に評価されます。値はゼロより大きく、NULL以外である必要があります。この制約に違反した場合、この単純な列に示すようにランタイム・エラーが通知されます。

>       SQL> begin
>       cont> declare :l, :s integer;
>       cont>
>       cont> -- set the step size
>       cont> set :s = 0;
>       cont>
>       cont> for :l in reverse 1 to 10 step :s
>       cont> do
>       cont>     trace :l;
>       cont> end for;
>       cont> end;
>       %RDB-E-NOT_VALID, validation on field STEP caused operation to fail
>       SQL>

## 例

> 例1: リバース・ループの使用

>     SQL> SET FLAGS 'TRACE';
>     SQL> BEGIN
>     cont>  DECLARE :LOOP_VAR INTEGER;
>     cont>  FOR :LOOP_VAR IN REVERSE 1 TO 5
>     cont>    DO
>     cont>      TRACE :LOOP_VAR;
>     cont>  END FOR;
>     cont> END;
>     ~Xt: 5
>     ~Xt: 4
>     ~Xt: 3
>     ~Xt: 2
>     ~Xt: 1

> 例2: ループ変数としてのINTERVAL型の使用

>     SQL> begin
>     cont> declare :i interval year;
>     cont> for :i in (interval'1' year) to (interval'4'year)
>     cont> do
>     cont>     trace :i;
>     cont> end for;
>     cont> end;
>     ~Xt:  01
>     ~Xt:  02
>     ~Xt:  03
>     ~Xt:  04

> 例3: STEP式としての複合式の使用

>     SQL> begin
>     cont> declare :i interval year;
>     cont> declare :k interval year = interval'18'year;
>     cont> declare :j integer = 2;
>     cont>
>     cont> for :i in (interval'1' year) to :k/2 step :j*2
>     cont> do
>     cont>     trace :i;
>     cont> end for;
>     cont> end;
>     ~Xt:  01
>     ~Xt:  05
>     ~Xt:  09

# GET DIAGNOSTICS文

> 以前のSQL文の実行またはSQLルーチン環境に関する診断情報を抽出します。

> GET DIAGNOSTICS文は、診断領域と呼ばれる、Oracle Rdbが保持するデータ構造体から診断情報を取得します。ANSI/ISO SQL規格では、診断領域は、単一ヘッダー領域と詳細領域の配列の2つのコンポーネントで構成されます。Oracle Rdbでは、ヘッダー・コンポーネントと詳細領域（例外1）の最初の要素からのみ情報を抽出します。

> - ヘッダー領域
>   INSERT文、UPDATE文またはDELETE文の影響を受ける行数、またはアクティブなトランザクションのタイプなど、行およびトランザクションに関するステータス情報を含みます。
>   ヘッダー領域から取得できるステータス情報の完全なリストは、statement-item-name引数を参照してください。

> - 詳細領域（例外1）
>   SQLSTATEまたはSQLCODEのステータス・パラメータで通知されるステータスに対応する診断情報を含みます。EXCEPTION...RETURNED_SQLSTATE引数は、詳細領域からSQLSTATEステータス情報を取得します。EXCEPTION...RETURNED_SQLCODE引数は、詳細領域からSQLCODEステータス情報を取得します。

## 環境

> GET DIAGNOSTICS文は、複数文プロシージャの複合文で次のような場合にのみ使用できます。

> - 対話型SQL内

> - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

> - SQLモジュールのプロシージャの一部として

> - 動的SQLで動的に実行される文として

## 形式

## 引数

> ### IMAGE_NAME

> アクティブ化したイメージ名をコール元に返すように要求します。イメージ名にはアタッチを開始したノード名が含まれます。これは、Oracle Rdbサーバーが稼働しているノードとは別のノードである場合があります。

> データはVARCHAR (255)値としてコール元に返されるため、ASCIIキャラクタ・セットをサポートするVARCHARデータ型またはCHARデータ型に割り当てる必要があります。

> ### EXCEPTION

> SQL文（GET DIAGNOSTICS以外）の実行の後に例外条件を返します。SQLCODEまたはSQLSTATEが返される場合があります。

> ### parameter = statement-item-name

> ### variable = statement-item-name

> 診断領域に記録された文の実行に関する情報を取得し、単純なターゲット指定（パラメータまたは変数）で保存します。

> ### RETURNED_SQLCODE

> SQLCODEをターゲットの変数またはパラメータに返すように要求します。返される情報のデータ型はINTEGERです。Oracle Rdbでは、SQLCODEについては成功ステータス（0）と警告ステータス（正の値）のみを返します。エラー・ステータスの場合は、常に複合文またはストアド・ルーチンがコール側アプリケーションに返されます。

> ### RETURNED_SQLSTATE

> SQLSTATEをターゲットの変数またはパラメータに返すように要求します。返される情報のデータ型はCHAR(5)です。Oracle Rdbでは、SQLSTATEについては成功ステータス（'00000'）と警告ステータスのみを返します。エラー・ステータスの場合は、常に複合文またはストアド・ルーチンがコール側アプリケーションに返されます。

> ### statement-item-name

> 以前に実行したSQL文について取得できる診断情報の種類を指定します。次の診断データを収集できます。

> - ACCESS_MODE: 文字列READ ONLY、READ WRITEまたはBATCH UPDATEを返してアクティブなトランザクションのタイプを示します。このような文字列はCHARデータ型です。アクティブなトランザクションがない場合は、この引数もNONEを返します。トランザクション・アクセス・モードの詳細は、「SET TRANSACTION文」を参照してください。

> - CALLING_ROUTINE: コール側ルーチンの名前のデータ型CHAR(31)の文字列を返します。コール側ルーチンの名前がない場合は、空白が返されます。

> - CONNECTION_NAME: 現行の接続名を返します。

> - CURRENT_ROW: 最内側のFOR制御文によってフェッチされた行数を整数値で返します。

> - GLOBAL_TRANSACTION: グローバル・トランザクションがアクティブな場合は整数1を、アクティブでない場合は整数0を返します。

> - ISOLATION_LEVEL: 文字列READ COMMITTED、REPEATABLE READまたはSERIALIZABLEを返して、トランザクションの分離レベルを示します。このような文字列はCHARデータ型です。アクティブなトランザクションがない場合は、この引数もNONEを返します。トランザクション分離レベルの詳細は、「SET TRANSACTION文」を参照してください。

> - LIMIT_CPU_TIME: セッション実行のCPUタイム制限（秒）をINTEGERの値で返します。ゼロ（0）が返された場合は、CPUタイム制限がないことを示します。この値は、論理名RDMS$BIND_QG_EXEC_CPU_TIMEOUTまたはSET QUERY EXECUTION LIMIT CPU TIME文によって設定されます。

> - LIMIT_ELAPSED_TIME: セッション実行の経過時間制限（秒）をINTEGERの値で返します。ゼロ（0）が返された場合は、経過時間制限がないことを示します。この値は、論理名RDMS$BIND_QG_EXEC_ELAPSED_TIMEOUTまたはSET QUERY EXECUTION LIMIT ELAPSED TIME文によって設定されます。

> - LIMIT_ROWS_FETCHED: セッションの行制限をBIGINTの値で返します。ゼロ（0）が返された場合は、行制限がないことを示します。この値は、論理名RDMS$BIND_QG_REC_LIMITによって設定されます。

> - ROW_COUNT: INSERT文、検索済UPDATE文、検索済DELETE文またはFORカーソル・ループ文の影響を受ける行数を整数で返します。

> - TRACE_ENABLED: INTEGERの値を返し、SET FLAGS 'TRACE'文を使用して、あるいは論理名RDMS$SET_FLAGSまたはRDMS$DEBUG_FLAGSを使用してTRACEフラグが有効にされたかどうかを示します。ゼロ（0）が返される場合はフラグは無効であり、1が返される場合はトレースが有効になっていることを示します。

> - TRANSACTION_ACTIVE: トランザクションがアクティブな場合は整数1を、アクティブでない場合は整数0を返します。

> - TRANSACTIONS_COMMITTED: 複数文プロシージャの処理中にコミットされたトランザクション数を整数値で返します。

> - TRANSACTIONS_ROLLED_BACK: 複数文プロシージャの処理中にロールバックされたトランザクション数を整数値で返します。

> - TRANSACTION_CHANGE_ALLOWED
>   SQL言語のプログラマがトランザクションを開始または終了する際、トランザクション文（SET TRANSACTION、START TRANSACTION、COMMITまたはROLLBACK）が現在使用可能かどうかが不明な場合が多数あります。次のいずれかの場合は、トランザクション文を使用できません。

>   - 複数データベースまたはグローバル・トランザクションの実行中。この場合、トランザクションはサーバーベースのプロシージャではなく、クライアントが調整する必要があります。

>   - BEGIN ATOMIC複合文が外部有効範囲内の場合。

>   - FORカーソル・ループ文が外部有効範囲内でアクティブな場合。

>   TRANSACTION_CHANGE_ALLOWED句により、プログラマはこのように制限された場所を検出し、必要に応じて条件付きでCOMMIT、ROLLBACK、START TRANSACTIONまたはSET TRANSACTIONを実行できます。
>   結果のデータ型はINTEGERです。トランザクションの変更が可能な場合、1の値が割り当てられます。変更できない場合、結果はゼロ（0）です。

> - HOT_STANDBY_MODE
>   このオプションは文字列を返し、このデータベースがマスター（'MASTER'が返される）またはスタンバイ（'STANDBY'が返される）としてホット・スタンバイ構成に関与しているか、あるいはそのような構成に関与していない（'NONE'が返される）かを示します。
>   結果のデータ型はCHAR(31)です。

> - SERVER_IDENTIFICATION
>   このオプションは、Oracle Rdbリリース番号に含まれているテキスト文字列を返します。これはログ・ファイル注釈に使用できます。
>   結果のデータ型はCHAR(31)です。

> - TRANSACTION_TIMESTAMP
>   このオプションは、最後のトランザクションが開始された日時を返します。トランザクションがアクティブでない場合は、以前のトランザクションの日時が返されることがあります。