ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


LOOP制御文

複合文で1つ以上のSQL文を繰り返し実行できます。

「FOR文」、「REPEAT文」および「WHILE文」も参照してください。


環境

LOOP制御文は、次の環境の複合文内でのみ使用できます。


形式




引数

beginning-label:

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

compound-use-statement

複合文ブロックで許可されたSQL文を識別します。有効な文のリストは、「複合文」を参照してください。

END LOOP ending-label

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

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

LOOP

制御ループの開始をマークします。LOOP文を使用すると、複合文と呼ばれる関連付けられた一連のSQL文を実行できます。SQLでループ内の文の実行が完了すると、次の文を実行するために制御はループの先頭にあるLOOP文に返されます。SQLでエラー例外が発生するか、LEAVE文が実行されるまでループは続行されます。どちらの場合も、SQLは、LOOPブロックからそのLOOP文の直後の文に制御を渡します。

使用方法

終了条件が含まれている場合を除き、LOOPは無制限に繰り返されます。


例1: ループ文の実行


SQL> create table ENROLLMENTS
cont>     (last_name          char(20),
cont>      first_name         char(10),
cont>      middle_initial     char,
cont>      class_name         char(10));
SQL>
SQL> begin
cont> declare :n integer default 5;
cont> loop
cont>     insert into ENROLLMENTS
cont>       values ('Jones', 'Robert', 'A',
cont>               'Class ' || CAST(:n as char(1)));
cont>     set :n = :n - 1;
cont>     if :n <= 0 then
cont>         leave;
cont>     end if;
cont> end loop;
cont> end;
SQL>
SQL> select * from ENROLLMENTS;
 LAST_NAME              FIRST_NAME   MIDDLE_INITIAL   CLASS_NAME
 Jones                  Robert       A                Class 5
 Jones                  Robert       A                Class 4
 Jones                  Robert       A                Class 3
 Jones                  Robert       A                Class 2
 Jones                  Robert       A                Class 1
5 rows selected
SQL>


OPEN文

カーソルをオープンして、カーソルの結果表の行をFETCH文で取得できるようにします。OPEN文は、カーソルの結果表の最初の行の前にカーソルを配置します。

環境

OPEN文は次の環境で使用できます。


形式



引数

cursor-name

parameter

オープンするカーソルの名前を指定します。このカーソル名で参照されるカーソルが動的DECLARE CURSOR文によって実行時に宣言されている場合は、パラメータを使用します。拡張動的DECLARE CURSOR文のカーソル名に使用されたパラメータを指定します。

OPEN文が拡張動的カーソルを参照している場合のみ、パラメータを使用してカーソル名を参照できます。

USING parameter

USING qualified-parameter

USING DESCRIPTOR descriptor-name

動的SQLパラメータ(プリコンパイルされたOPEN文のホスト言語変数またはSQLモジュール言語プロシージャの一部であるOPEN文の仮パラメータ)または修飾パラメータ(構造体)で指定します。この修飾パラメータの値は、カーソル宣言で指定されている準備されたSELECT文のパラメータ・マーカーを置き換えるためにSQLで使用されます。これらのパラメータは、対話型SQLでは使用されません。SQLは、カーソルのSELECT文の評価時にパラメータ・マーカーをホスト言語変数の値に置き換えます。SQLモジュール言語およびSQLプリコンパイラの詳細は、第3章第4章をそれぞれ参照してください。

次の両方の条件を満たしているときはUSING句を指定する必要があります。

準備されたSELECT文に基づいていないカーソルでは、OPEN文でUSING句を使用できません。パラメータ・マーカーの詳細は、「PREPARE文」、および『Oracle Rdb7 Guide to SQL Programming』の動的SQLに関する章を参照してください。

USING句のパラメータの指定には、次の2つの方法があります。

ホスト言語変数のデータ型は、カーソルの行の対応する列の値と互換性を持つ必要があります。


使用方法


例1: PL/Iプログラムで宣言されたカーソルのオープン

このプログラムの一部では埋め込まれたDECLARE CURSOR文、OPEN文およびFETCH文が使用され、マネージャの名前と部門が取得および出力されます。OPEN文は、フェッチされる行の先頭にカーソルを配置します。


/* 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 host language variables: */
        EXEC SQL FETCH MANAGER INTO :FNAME, :LNAME, :DNAME;
        /* Print the values in the variables: */
                        .
                        .
                        .
END;

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

例2: リスト・データの挿入に使用するカーソルのオープン

次の対話型SQLの例では、カーソルを使用して、サンプルの人事データベースのRESUMES表に新規行を追加します。


SQL> DECLARE TBLCURSOR INSERT ONLY TABLE CURSOR FOR
cont> SELECT EMPLOYEE_ID, RESUME FROM RESUMES;
SQL> DECLARE LSTCURSOR INSERT ONLY LIST CURSOR FOR
cont> SELECT RESUME WHERE CURRENT OF TBLCURSOR;
SQL> OPEN TBLCURSOR;
SQL> INSERT INTO CURSOR TBLCURSOR (EMPLOYEE_ID)
cont> VALUES ("00167");
1 row inserted
SQL> OPEN LSTCURSOR;
SQL> INSERT INTO CURSOR LSTCURSOR
cont> VALUES ("This is the resume for 00167");
SQL> INSERT INTO CURSOR LSTCURSOR
cont> VALUES ("Boston, MA");
SQL> INSERT INTO CURSOR LSTCURSOR
cont> VALUES ("Oracle Corporation");
SQL> CLOSE LSTCURSOR;
SQL> CLOSE TBLCURSOR;
SQL> COMMIT;


オペレーティング・システムの起動($)文

SQL内からオペレーティング・システムのコマンドライン環境へのアクセスを可能にします。

ドル記号($)は、サブプロセスを生成して、行の残りの部分を処理するためにオペレーティング・システムに渡すようにSQLに伝えます。ドル記号の後にオペレーティング・システム・コマンドを続ける必要があります。コマンドの処理を完了すると、オペレーティング・システムはサブプロセスのプロセスからログアウトしてSQLに制御を返します。


環境

オペレーティング・システム・コマンドは、対話型SQLでのみ起動できます。

形式



引数

operating-system-command

有効なオペレーティング・システム・コマンドを指定します。

使用方法


例1: SQL内からのDCL DIRECTORYコマンドの使用


SQL> $ DIRECTORY *.SQL

Directory DISK2:[DEPT3.ACCT]

DEFPRO.SQL;6    NOTEQUAL.SQL;1   QUERY.SQL;1    REFEXAM.SQL;12
STORE.SQL;1     UPDATE.SQL;2

Total of 6 files.
SQL>


PREPARE文

プログラムによって動的に生成されるSQL文を実行に向けて準備し、その文に名前を割り当てます。

動的SQLでは、SQLモジュール言語プロシージャとは対照的に、プログラムは実行時にSQL文を受け入れたり生成できます。プリコンパイルされたSQLまたはSQLモジュール言語文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行中に生成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。

PREPARE...INTO文は、準備された文の選択リスト項目の数とデータ型をSQLDAに格納します。SQLDAでは、動的SQL文の情報をプログラムに、そのプログラムによって割り当てられたメモリーの情報をSQLに提供します。

付録Dには、SQLDAの特定のフィールドの詳細と、プログラムがSQLDAを使用して、準備された文の選択リスト項目と通信する方法の詳細が記載されています。


環境

PREPARE文は次の環境で使用できます。


形式



引数

descriptor-name

SQLが選択リスト項目の情報を書き込むSQLDAとして、ホスト・プログラムで宣言された構造体の名前を指定します。プリコンパイルされたプログラムは、埋込みSQL文のINCLUDE SQLDAを使用して、プログラムのプリコンパイル時に、SQLDAと呼ばれるSQLDA構造体の宣言をプログラムに自動的に挿入できます。SQLモジュール言語を使用するプログラムは、SQLDAを明示的に宣言する必要があります。プリコンパイルされたプログラムまたはSQLモジュール言語プログラムは、追加のSQLDAを明示的に宣言できますが、SQLDAはそれぞれ一意の名前で宣言する必要があります。SQLDA構造体のサンプル宣言は、付録D.3節を参照してください。

FROM statement-string

FROMパラメータ

動的実行のために準備されるSQL文を指定します。文の文字列を一重引用符で囲んで直接指定するか、または文の文字列を含むパラメータ(プリコンパイルされたPREPARE文のホスト言語変数またはSQLモジュール言語プロシージャの一部であるPREPARE文の仮パラメータ)で指定します。

直接指定、パラメータによる指定のいずれの場合も、文の文字列は動的に実行SQL文である文字列である必要があります。(動的に実行可能なSQL文のリストは、「使用方法」を参照してください。)文の文字列を直接指定する場合、最大長は1024文字です。文の文字列をパラメータで指定する場合、文の文字列の最大長は65535文字です。

文の形式は、次の点を除き埋込みSQL文と同じです。

無効な文を準備しようとすると、SQLCODEの値、SQLCAのSQLCODEフィールドの値またはSQLSTATEのステータス・パラメータの値がエラーを示します。

SQLCODEフィールドに返される値の詳細は、付録Cを参照してください。返されたエラー・メッセージを確認するには、メッセージ・ベクターをチェックしてください。必要な場合は、エラー・メッセージの説明とデフォルト設定のユーザー処理をSQL HELP ERRORSで参照します。

パラメータ・マーカーとは疑問符(?)であり、PREPARE文の文字列にあるパラメータを表します。準備された文がEXECUTE文またはOPEN文によって実行されると、パラメータ・マーカーはパラメータの値または動的メモリーの値に置き換えられます。

SELECT LIST INTO

文の文字列の選択リスト項目の数およびデータ型の情報をSQLがSQLDAに書き込むように指定します。オプションのSELECT LISTキーワードは、INTO句の効果を明確にします。

PREPARE文でSELECT LIST句を使用すると、個別のDESCRIBE...INPUT文を発行できます。詳細は、「DESCRIBE文」を参照してください。

PREPARE文のSELECT LIST句は廃止予定の構文です。廃止予定の構文の詳細は、付録Fを参照してください。

注意

PREPARE文のLISTキーワードは、LISTデータ型またはリスト・カーソルに関連付けられていません。

statement-name

statement-id-parameter

FROM句で指定されたSQL文の準備されたバージョンを識別します。準備されたSQL文のタイプによっては、DESCRIBE文、EXECUTE文および動的DECLARE CURSOR文は、PREPARE文で割り当てられた文の名前を参照できます。

パラメータまたはコンパイル時の文名を指定できます。パラメータを指定すると、SQLは実行時にプログラムの識別子を設定します。SQLが返した文識別子を含むには、整数パラメータを使用します。SQLに渡す文の名前を含むには、文字列パラメータを使用します。

1セットの動的SQL文(PREPARE、DESCRIBE、EXECUTE、拡張動的DECLARE CURSOR)によって、任意の数の動的に実行される文を処理できます。パラメータを使用する場合は、準備された文を参照する文(DESCRIBE、EXECUTE、拡張動的DECLARE CURSOR)でも、明示的な文の名前のかわりにパラメータを使用する必要があります。

動的DECLARE CURSOR文で使用されるPREPARE文を示す例は、「DECLARE CURSOR文、動的」を参照してください。


使用方法

表6-11に、動的に実行可能なSQL文を示します。この表は、処理を必要とする場合があるパラメータ・マーカーまたは選択リスト項目を文で使用可能かどうか、および文を動的に処理するために使用される、関連付けられた動的でないSQL文を示します。

表6-11 動的に実行可能なSQL文
動的に実行可能な文 パラメータ・マーカーの使用 選択リスト項目の使用 関連付けられた動的SQL文
SELECT(一般形式) PREPARE
動的DECLARE CURSOR
拡張動的DECLARE CURSOR
DESCRIBE (オプション)
OPEN
FETCH
CLOSE
RELEASE(オプション)
       
DELETE文
INSERT文
UPDATE文
SET文
× PREPARE
DESCRIBE(オプション)
EXECUTE
EXECUTE IMMEDIATE(パラメータ・マーカーがない場合)
RELEASE(オプション)
       
複合文
SELECT ... INTO
INSERT ... RETURNING INTO
UPDATE ... RETURNING INTO
PREPARE
DESCRIBE(オプション)
EXECUTE
EXECUTE IMMEDIATE(パラメータ・マーカーがない場合)
RELEASE(オプション)
       
ALTER
ATTACH
DECLARE TRANSACTION
CREATE
COMMENT ON
COMMIT
DROP
GRANT
RENAME
REVOKE
ROLLBACK
SET TRANSACTION
START TRANSACTION
TRUNCATE
× × PREPARE
EXECUTE
EXECUTE IMMEDIATE
RELEASE(オプション)


例1: パラメータ・マーカーを持つINSERT文の準備

このPL/Iプログラムは、動的実行するINSERT文を準備するためにPREPARE文を使用する方法を示しています。COMMAND_STRINGに格納されている文の文字列はパラメータ・マーカーを持つため、プログラムは、動的実行中にパラメータ・マーカーの代替となるホスト言語変数の値を割り当てる必要があります。

この場合、DESCRIBE文はパラメータ・マーカーの情報をSQLDAに書き込み、プログラムは変数のアドレスをSQLDAに書き込みます。プログラムは変数に値を格納し、EXECUTE文は、SQLDAのアドレスを使用してINSERT文のパラメータ・マーカーを変数の値に置き換えます。

例を短くするために、このプログラムは次のように簡略化されています。


PREP_INTO: procedure options(main);
/*
*       Illustrate a dynamic INSERT statement
*       with parameter markers:
*/
declare FILESPEC char(20),
        EMP_ID CHAR(5),
        FNAME CHAR(10),
        LNAME CHAR(14),
        CITY CHAR(20),
        COMMAND_STRING char(256);

/* Declare communication area (SQLCA)
 * and descriptor area (SQLDA): */
EXEC SQL        INCLUDE SQLDA;
EXEC SQL        INCLUDE SQLCA;

/* Declare the database: */
EXEC SQL DECLARE SCHEMA RUNTIME FILENAME :FILESPEC;

/*
 *
 * procedure division
 *
 */

/*
 * Assign values to FILESPEC and COMMAND_STRING,
 * and allocate memory for the SQLDA:
 */
FILESPEC = 'SQL$DATABASE';
COMMAND_STRING =
        'INSERT INTO EMPLOYEES
        (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, CITY)
        VALUES (?,?,?,?)';
SQLSIZE = 10;
ALLOCATE SQLDA SET (SQLDAPTR);
SQLN = 10;

/*
 * Prepare the statement assigned to COMMAND_STRING:
 */
EXEC SQL PREPARE STMT3
        FROM COMMAND_STRING;

/* Use a DESCRIBE statement to write information
 * about the parameter markers in the statement string
 * to the SQLDA:
 */
EXEC SQL DESCRIBE STMT3 MARKERS INTO SQLDA;

/* Assign values to the variables: */
        EMP_ID = '99999';
        FNAME = 'Bob';
        LNAME = 'Addams';
        CITY = 'Francestown';

/*
 * Assign the addresses of the variables to the SQLDATA field
 * of the SQLDA:
 */
        SQLDATA(1) = ADDR(EMP_ID);
        SQLDATA(2) = ADDR(FNAME);
        SQLDATA(3) = ADDR(LNAME);
        SQLDATA(4) = ADDR(CITY);

/* Execute STMT3:*/
EXEC SQL EXECUTE STMT3 USING DESCRIPTOR SQLDA;

/*
* Display the contents of table S to make sure
* it has the proper contents and clean it up:
*/
CALL DUMP_S;
EXEC SQL DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID = "99999";
EXEC SQL COMMIT WORK;
RETURN;

DUMP_S: PROC;
EXEC SQL DECLARE X CURSOR FOR SELECT
        EMPLOYEE_ID, FIRST_NAME, LAST_NAME, CITY
        FROM EMPLOYEES WHERE EMPLOYEE_ID = "99999";

/*
 * Declare a structure to hold values of rows from the table:
*/
DCL 1 S,
        2 EMP_ID CHAR(5),
        2 FNAME CHAR(10),
        2 LNAME CHAR(14),
        2 CITY CHAR(20);

/* Declare indicator vector for the preceding structure: */
DCL S_IND (4) FIXED(15) BIN;

PUT EDIT ('Dump the contents of S') (SKIP, SKIP, A);
EXEC SQL OPEN X;
EXEC SQL FETCH X INTO :S:S_IND;
DO WHILE (SQLCODE = 0);
   PUT EDIT (S_IND(1), ' ', S.EMP_ID, ' ')   (SKIP, F(6), A, A, A);
   PUT EDIT (S_IND(2), ' ', S.FNAME, ' ')  (F(6), A, A, A);
   PUT EDIT (S_IND(3), ' ', S.LNAME, ' ') (F(6), A, A, A);
   PUT EDIT (S_IND(4), ' ', S.CITY)   (F(6), A, A);
   EXEC SQL FETCH X INTO :S:S_IND;
END;
EXEC SQL CLOSE X;
RETURN;
END DUMP_S;

END PREP_INTO;