ヘッダーをスキップ
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制御文は、次の環境で使用できます。


形式




引数

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など)のフィールドを参照できます。


使用方法



例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カウント制御文は、次の環境で使用できます。


形式



引数

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ループ変数の参照が副次的な影響を及ぼさないことが確認されます。


使用方法


例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)の最初の要素からのみ情報を抽出します。


環境

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


形式





引数

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文について取得できる診断情報の種類を指定します。次の診断データを収集できます。