ヘッダーをスキップ

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

戻る | 次へ |

前のプログラムの一部によりコールされたSQLモジュール言語プロシージャは、次のとおりです。

       .
       .
       .
    -------------------------------------------------------------------------------
    -- Procedure Section
    -------------------------------------------------------------------------------

    -- This procedure prepares a statement for dynamic execution from the string
    -- passed to it.  It also writes information about the number and data type of
    -- any select list items in the statement to an SQLDA2 (specifically,
    -- the sqlda_out SQLDA2 passed to the procedure by the calling program).
    --

    PROCEDURE PREPARE_STMT
        SQLCA
        :DYN_STMT_ID      INTEGER
        :STMT            CHAR(1024);

        PREPARE :DYN_STMT_ID FROM :STMT;

    -- This procedure writes information to an SQLDA (specifically,
    -- the sqlda_in SQLDA passed to the procedure by the calling program)
    -- about the number and data type of any parameter markers in the
    -- prepared dynamic statement.  Note that SELECT statements may also
    -- have parameter markers.

    PROCEDURE DESCRIBE_SELECT
        SQLCA
        :DYN_STMT_ID    INTEGER
        SQLDA;

        DESCRIBE :DYN_STMT_ID OUTPUT INTO SQLDA;

    PROCEDURE DESCRIBE_PARM
        SQLCA
        :DYN_STMT_ID INTEGER
        SQLDA;

        DESCRIBE :DYN_STMT_ID INPUT INTO SQLDA;

    -- This procedure dynamically executes a non-SELECT statement.
    -- SELECT statements are processed by DECLARE CURSOR, OPEN CURSOR,
    -- and FETCH statements.
    --
    -- The EXECUTE statement specifies an SQLDA2 (specifically,
    -- the sqlda_in SQLDA2 passed to the procedure by the calling program)
    -- as the source of addresses for any parameter markers in the dynamic
    -- statement.
    --
    -- The EXECUTE statement with the USING DESCRIPTOR clause
    -- also handles statement strings that contain no parameter markers.
    -- If a statement string contains no parameter markers, SQL sets
    -- the SQLD field of the SQLDA2 to zero.

    PROCEDURE EXECUTE_STMT
        SQLCA
        :DYN_STMT_ID INTEGER
        SQLDA;

        EXECUTE :DYN_STMT_ID USING DESCRIPTOR SQLDA;
       .
       .
       .

# EXECUTE IMMEDIATE文

> SQL文を動的に準備、実行および解放します。

> EXECUTE IMMEDIATE文は動的SQL文です。動的SQLでは、コンパイルの前にプログラムに埋め込む必要があるプリコンパイルされたSQL文とは対照的に、プログラムで実行時にSQL文を受け入れるか、生成できます。埋込みSQL文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行時に作成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。

> EXECUTE IMMEDIATE文にはパラメータ・マーカーを組み込めません。ただし、文がそのような制限を満たし、1回のみ動的に実行する場合は、PREPARE文とEXECUTE文のかわりにEXECUTE IMMEDIATE文を使用します。

## 環境

> EXECUTE IMMEDIATE文は次の環境で使用できます。

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

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

## 形式

## 引数

> ### statement-string

> ### parameter

> 準備して動的に実行するSQL文を指定します。文の文字列を、一重引用符で囲んで文字列リテラルに直接指定するか、文の文字列を組み込んだパラメータに指定できます。

> 直接指定、パラメータによる指定のいずれの場合も、文の文字列はSELECT文以外の動的な実行SQL文である文字列である必要があります。文の形式は埋込みSQLと同じです。ただし、文字列をEXEC SQLで始めるか、文の終了記号で終了する必要はありません。

## 例

> 例1: EXECUTE IMMEDIATE文を指定したINSERT文の実行

> このCOBOLプログラムは、EXECUTE IMMEDIATE文を使用した動的INSERT文の準備および実行を示します。この例をEXECUTE文の例と比較します（「EXECUTE文」を参照）。EXECUTE文では、パラメータ・マーカーのあるINSERT文を使用して挿入操作の結果を表示します。

>     IDENTIFICATION DIVISION.
>     PROGRAM-ID.   EXECUTE_IMMEDIATE_EXAMPLE.
>     *
>     * Illustrate EXECUTE_IMMEDIATE with a dynamic INSERT statement.
>     *
>     DATA DIVISION.

>     WORKING-STORAGE SECTION.

>     * Variable for DECLARE SCHEMA:
>     01 FILESPEC     PIC X(20).

>     * Variables to hold values for
>     * storage in EMPLOYEES:
>     01 EMP_ID       PIC X(5).
>     01 FNAME        PIC X(10).
>     01 MID_INIT     PIC X(1).
>     01 LNAME        PIC X(14).
>     01 ADDR_1       PIC X(25).
>     01 ADDR_2       PIC X(25).
>     01 CITY         PIC X(20).
>     01 STATE        PIC X(2).
>     01 P_CODE       PIC X(5).
>     01 SEX          PIC X(1).
>     01 BDATE        PIC S9(11)V9(7) COMP.
>     01 S_CODE       PIC X(1).

>     * Indicator variables for retrieving
>     * the entire row, including columns we
>     * do not assign values to, from
>     * the EMPLOYEES table:
>     01 EMP_ID_IND   PIC S9(4) COMP.
>     01 FNAME_IND    PIC S9(4) COMP.
>     01 MID_INIT_IND PIC S9(4) COMP.
>     01 LNAME_IND    PIC S9(4) COMP.
>     01 ADDR_1_IND   PIC S9(4) COMP.
>     01 ADDR_2_IND   PIC S9(4) COMP.
>     01 CITY_IND     PIC S9(4) COMP.
>     01 STATE_IND    PIC S9(4) COMP.
>     01 P_CODE_IND   PIC S9(4) COMP.
>     01 SEX_IND      PIC S9(4) COMP.
>     01 BDATE_IND    PIC S9(4) COMP.
>     01 S_CODE_IND   PIC S9(4) COMP.

>     * Buffer for error handling:
>     01 BUFFER       PIC X(300).
>     01 LEN          PIC S9(4) USAGE IS COMP.

>     * 01 disp_sqlcode       pic s9(9) sign leading separate.

>     * Load definition for SQL Communication Area (SQLCA):
>     EXEC SQL        INCLUDE SQLCA END-EXEC.

>     ********************************************************************
>     *
>     *               P R O C E D U R E    D I V I S I O N
>     *
>     ********************************************************************
>     PROCEDURE DIVISION.
>     START-UP.

>     * Assign value to FILESPEC:
>             MOVE "SQL$DATABASE" TO FILESPEC

>     * Declare the schema:
>             EXEC SQL DECLARE SCHEMA RUNTIME FILENAME :FILESPEC
>             END-EXEC

>     *               Use an EXECUTE IMMEDIATE statement
>     *               to execute an INSERT statement:
>                 EXEC SQL EXECUTE IMMEDIATE
>                 "INSERT INTO EMPLOYEES
>     -               "(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,CITY)
>     -               "VALUES ('99999','Les','Warton','Hudson')"
>                 END-EXEC
>                 PERFORM CHECK.

>             PERFORM FETCHES.

>     EXEC SQL EXECUTE IMMEDIATE 'ROLLBACK' END-EXEC.
>             PERFORM CHECK.

>             DISPLAY "Rolled back changes.  All done.".

>     CLEAR-IT-EXIT.
>             EXIT PROGRAM.

>     FETCHES.
>             DISPLAY "Here's the row we stored:"

>             EXEC SQL PREPARE STMT FROM
>             'SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = "99999"'
>             END-EXEC
>             EXEC SQL DECLARE C CURSOR FOR STMT END-EXEC

>             EXEC SQL OPEN C END-EXEC
>     *       Clear values in host language
>     *       variables in case new values
>     *       from the table are null:
>             MOVE SPACES TO EMP_ID
>             MOVE SPACES TO FNAME
>             MOVE SPACES TO MID_INIT
>             MOVE SPACES TO LNAME
>             MOVE SPACES TO ADDR_1
>             MOVE SPACES TO ADDR_2
>             MOVE SPACES TO CITY
>             MOVE SPACES TO STATE
>             MOVE SPACES TO P_CODE
>             MOVE SPACES TO SEX
>             MOVE ZERO TO BDATE
>             MOVE SPACES TO S_CODE

>             EXEC SQL FETCH C INTO
>                     :EMP_ID:EMP_ID_IND,
>                     :LNAME:LNAME_IND,
>                     :FNAME:FNAME_IND,
>                     :MID_INIT:MID_INIT_IND,
>                     :ADDR_1:ADDR_1_IND,
>                     :ADDR_2:ADDR_2_IND,
>                     :CITY:CITY_IND,
>                     :STATE:STATE_IND,
>                     :P_CODE:P_CODE_IND,
>                     :SEX:SEX_IND,
>                     :BDATE:BDATE_IND,
>                     :S_CODE:S_CODE_IND
>             END-EXEC

>             DISPLAY EMP_ID," ",
>                     FNAME," ",
>                     MID_INIT," ",
>                     LNAME," ",
>                     ADDR_1," ",
>                     ADDR_2," ",
>                     CITY," ",
>                     STATE," ",
>                     P_CODE," ",
>                     SEX," ",
>                     BDATE," ",
>                     S_CODE.

>             PERFORM CHECK.
>             EXEC SQL CLOSE C END-EXEC.

>     CHECK.
>             IF SQLCODE NOT = 100 AND SQLCODE NOT = 0
>                     DISPLAY "Error: SQLCODE = ", SQLCODE
>                 CALL "SQL$GET_ERROR_TEXT" USING
>                     BY DESCRIPTOR BUFFER,
>                     BY REFERENCE LEN
>                 DISPLAY BUFFER(1:LEN)
>             END-IF.

# EXIT文

> 対話型SQLセッションを停止し、オペレーティング・システムのプロンプトに戻ります。デフォルトでは、EXIT文はセッション中に行われた変更をコミットします。

## 環境

> EXIT文は、対話型SQLでのみ発行できます。

## 形式

## 使用方法

> - QUIT文およびEXIT文はともに対話型SQLセッションを終了します。QUIT文は、セッション中に加えた変更を自動的にロールバックします。EXIT文の場合、デフォルトではセッション中に加えた変更をコミットします。

> - EXIT文を発行したときにデータベースに対する変更をコミットしていない場合は、SQLでは、トランザクションをロールバックするかどうかが求められます。

>       There are uncommitted changes to this database.
>       Would you like a chance to ROLLBACK these changes (No)?

>   返答せずに[Return]キーを押すかNOと入力すると、SQLでは最後のCOMMIT文またはROLLBACK文以降の変更がすべてコミットされます。プロンプトにYESと入力すると、SQLプロンプトに戻ります。

> - [Ctrl]キーを押しながら[Z]キーを押すと、OpenVMSでEXIT文を発行することと同じになります。

# EXPORT文

> 中間形式でデータベースのコピーを作成します。IMPORT文を使用して、EXPORT文によって作成された交換ファイル（ファイル拡張子.rbr）からOracle Rdbデータベースを再構築します。

> IMPORT文とともにEXPORT文を使用すると、他の方法では不可能なOracle Rdbデータベースの変更を実行できます。EXPORT文は、データベースを.rbrファイルにアンロードします。IMPORT文は、ALTER文で可能な変更と不可能な変更の両方を加えて、データベースを再作成します。詳細は、「IMPORT文」を参照してください。

## 環境

> EXPORT文は、対話型SQLでのみ使用できます。

## 形式

## 引数

> ### ALIAS alias

> ### FILENAME file-spec

> ### PATHNAME path-name

> .rbrファイルに書き込むソース・データベース・ファイルを指定します。

> - ALIAS引数ではアタッチ済のデータベースの別名を指定します。エクスポートするデータベースがすでにアタッチされている場合、ALIASを指定すると、データベースへの別のアタッチのオーバーヘッドとアタッチによるロックを回避できます。

> - FILENAME引数およびPATHNAME引数はともに、データベースに関連付けられたデータベース・ルート・ファイルを識別します。リポジトリ・パス名を指定する場合は、パス名により間接的にデータベース・ルート・ファイルが指定されます。EXPORT文では、リポジトリの定義は変更されないため、PATHNAME引数とFILENAME引数の影響による相違はありません。

> ### FORWARD_REFERENCES

> ### NO FORWARD_REFERENCES

> EXPORT文ではデータベース内のすべての依存関係を分析して、どのファンクションおよびプロシージャが他の定義によって参照されているかを判断します。IMPORTでは厳密な順序で各オブジェクト・タイプを定義するため、その定義の前に一部の定義を使用する場合があります。たとえば、表はモジュールより先に定義されますが、表はモジュールからSQLファンクションをコールすることがあります。FORWARD_REFERENCESオプションでは、EXPORTで最初にこれらのルーチンを交換ファイルに保存して、その使用前にIMPORTで宣言できるように要求します。詳細は、「DECLAREルーチン文」を参照してください。

> デフォルトはFORWARD_REFERENCESです。Oracle Rdb 7.1.0.4より前のバージョンで交換ファイルを使用する場合は、NO FORWARD_REFERENCESオプションを使用してこの情報を除外してください。

> ### INTO file-spec

> EXPORT文で作成した.rbrファイルの名前を指定します。オプションでファイル仕様にデバイスおよびディレクトリ仕様を組み込ます。

> ### literal-user-auth

> データベース（特にリモート・データベース）へのアクセスに使用するユーザー名およびパスワードを指定します。

> このリテラルにより、EXPORT文でユーザー名およびパスワードの情報を明示的に指定できます。

> ### USER 'username'

> データベース・システムで権限チェックに使用されるオペレーティング・システムのユーザー名を指定する文字列リテラルを定義します。

> ### USING 'password'

> USER句で指定されているユーザー名に対するユーザーのパスワードを指定する文字列リテラルを定義します。

> ### WITH DATA

> ### WITH NO DATA

> EXPORT文で作成する.rbrファイルに、データベースに含まれるデータとメタデータを含めるか、またはメタデータのみを含めるかを指定します。デフォルトはWITH DATAです。

> WITH NO DATAオプションを指定すると、EXPORT文によりメタデータがソース・データベースから.rbrファイルにコピーされますが、データはコピーされません。IMPORT文を使用すると、メタデータがソース・データベースのものと同一の空のデータベースが生成されます。

> 注意 WITH NO DATAオプションは、Oracle CDD/リポジトリ・データベース（CDD$DATABASE.RDB）と互換性がありません。CDD$DATABASE.RDBをエクスポートしようとすると、SQLでは、WITH NO DATAオプションがOracle CDD/リポジトリ・データベースでは無効であることを示すエラー・メッセージが表示されます。

> ### WITH EXTENSIONS

> ### WITH NO EXTENSIONS

> EXPORT文で作成する.rbrファイルに、Oracle Rdbバージョン3.0以上のデータベース・システムとのみ互換性のある拡張子を組み込むかどうかを指定します。デフォルトはWITH EXTENSIONSです。

> WITH NO EXTENSIONSオプションを指定すると、その結果生成される交換ファイル（.rbr）には、ドメイン、表および索引の定義のみが含まれます。索引はソート索引に変換された、マイナス記憶域マップです。ドメインに対して次の変換が行われます。

> - TINYINTデータ型はSMALLINTデータ型に変換されます。

> - DATE、ANSI、TIMESTAMPおよびTIMEの各データ型はDATE VMSデータ型に変換されます。

> また、NULL値は列の欠落値に変換されるか、デフォルトで欠落値固有のデータ型になります。たとえば、NULLの数値はゼロに置換され、NULLの文字値は空白に置換されます。

> WITH NO EXTENSIONSオプションを指定すると、Oracle Rdbデータベースの多数の機能がエクスポートされません。たとえば、記憶域、記憶域マップ、トリガー、照合順番、ファンクション、モジュールおよびアウトラインは、WITH NO EXTENSIONS引数を指定するとバックアップされません。

> 注意 WITH NO EXTENSIONSオプションは、Oracle CDD/リポジトリ・データベース（CDD$DATABASE.RDB）と互換性がありません。CDD$DATABASE.RDBデータベースをエクスポートしようとすると、SQLでは、WITH NO EXTENSIONSオプションがOracle CDD/リポジトリ・データベースでは無効であることを示すエラー・メッセージが表示されます。

## 使用方法

> - EXPORT文でデータベースをバックアップするには、データベースのすべてのオブジェクトに対する読取りアクセス権が必要です。

> - ALTER DATABASE文を使用してデータベースにOPEN IS MANUALを設定した場合、そのデータベースがクローズしているときはエクスポートできません。

> - IMPORT文、EXPORT文およびALTER DATABASE文の使用する場合の詳細は、『Oracle Rdb7 Guide to Database Maintenance』を参照してください。

> - INTERVALドメインが含まれている場合は、WITH NO EXTENSIONS句を使用してデータベースをエクスポートできません。Oracle Rdbでは、問題となっているドメインおよび関連する列を削除（「DROP DOMAIN文」を参照）するか、WITH NO EXTENSIONS句を指定せずにEXPORT操作を実行することをお薦めします。

> - 通常、エクスポート操作中は、Record Management Services（RMS）デフォルト・エクステントを使用するOracle Rdb交換ファイル（.rbr）は、.rbrファイルのサイズが増大する3ブロックごとに拡張します。これを防止するには、次のSET文を定義してデフォルトRMSエクステント量のプロセスを変更します。

>       $ SET RMS_DEFAULT/EXTEND_QUANTITY=30000

>   ここでは、.rbrファイルを3ブロックごとに拡張（多数の拡張操作が必要）するのではなく、RMS拡張が30,000ブロックごとに1回のみ起動されます。ファイル拡張パラメータに大きな値を指定することにより、エクスポート操作の実行時間は大幅に短縮されます。

> - Oracle Rdbでは、Oracle Rdbの異なるバージョン間のリモート・エクスポートはサポートしていません。EXPORT文を発行するシステムのバージョン番号が、エクスポート対象のデータベースのバージョン番号と等しい場合にのみ、正常にデータベースをエクスポートできます。

> - ノードの指定は、EXPORT DATABASE文のルートのFILENAME句に対してのみ行われている可能性があります。

> - EXPORT文によって作成される中間ファイルは交換形式でコーディングされており、新規データベース作成のためIMPORT文により処理できます。交換ファイルには表および列メタデータ、行データ、各行のNULL値が含まれています。

> - デフォルトでは、IMPORT文で同じファイル仕様と割当てが使用されます。RMU Extractコマンドは、Item=Import修飾子とともに使用して、データベース管理者がファイルの場所を変更するためのテンプレートIMPORTコマンドを作成できます。Defaults=AllocationとDefaults=Snapshot_Allocation、およびOptions=Filename_Only修飾子を使用すると、簡易スクリプトを作成できます。

> - RMU Loadコマンドでも、EXPORT文で作成した交換形式ファイルを処理できます。RMU LoadコマンドにMatch_Name修飾子を指定して、交換ファイルから選択する表の名前を指定します。

> - EXPORT文により、単一トランザクションですべてのメタデータおよびデータをソース・データベースから抽出します。これはSTART DEFAULT TRANSACTION文と同じ方法で実行します。
>   たとえば、TRANSACTIONキーワードにRDMS$SET_FLAGS論理名を定義すると、この単一トランザクションの開始とコミットを確認できます。

>       $ DEFINE/USER_MODE RDMS$SET_FLAGS TRANSACTION
>       $ SQL$
>       SQL> EXPORT DATABASE FILENAME PERSONNEL INTO SAVED_PERSONNEL.RBR;
>       ~T Compile transaction (1) on db: 1
>       ~T Transaction Parameter Block: (len=0)
>       ~T Start_transaction (1) on db: 1, db count=1
>       ~T Commit_transaction (1) on db: 1
>       ~T Prepare_transaction (1) on db: 1
>       SQL>

>   長さがゼロのTransaction Parameter Blockは、START DEFAULT TRANSACTIONプロセスが実行されたことを示します。Oracle Rdbサーバーでは、現在のユーザーのデータベースにデフォルト定義を設定しようとしますが、何も見つからなかった場合は、この例に示すように、READ ONLYトランザクションが開始されます。
>   環境によっては、この種のトランザクションが望ましくないこともあります。たとえば、SNAPSHOTSがENABLED DEFERREDとして定義されている環境では、このトランザクション・タイプにより、データベース作成者にSNAPSHOTファイルへの書込みの開始が強制されます。
>   この場合、EXPORT文を実行するユーザーのPROFILEを定義し、PROFILEをより適切なデフォルト・トランザクション定義に関連付けられます。次の例では、ISOLATION LEVEL READ COMMITTEDを使用してEXPORTと他のデータベース・ユーザー間の同時実行性を向上させます。

>       SQL> CREATE PROFILE DB_ADMIN
>       cont> DEFAULT TRANSACTION
>       cont>   READ WRITE
>       cont>   WAIT 10
>       cont>   ISOLATION LEVEL READ COMMITTED;
>       SQL> CREATE USER PHILIP IDENTIFIED EXTERNALLY PROFILE DB_ADMIN;
>       SQL> COMMIT;

>   このユーザーがEXPORT文を実行すると、プロファイルからのデフォルト・トランザクションが使用されます。

>       $ SQL$
>       SQL> EXPORT DATABASE FILENAME PERSONNEL INTO SAVED_PERSONNEL.RBR;
>       ~T Compile transaction (1) on db: 1
>       ~T Transaction Parameter Block: (len=6)
>       0000 (00000) TPB$K_VERSION = 1
>       0001 (00001) TPB$K_ISOLATION_LEVEL1 (read committed)
>       0002 (00002) TPB$K_WAIT_INTERVAL 10 seconds
>       0005 (00005) TPB$K_WRITE (read write)
>       ~T Start_transaction (1) on db: 1, db count=1
>       ~T Commit_transaction (1) on db: 1
>       ~T Prepare_transaction (1) on db: 1
>       SQL>

>   このデフォルト・トランザクションとの関連付けは、EXPORT文の完了後に削除できます。

>       SQL> ALTER USER PHILIP NO PROFILE;
>       SQL> COMMIT;

# FETCH文

> 結果表の次の行にカーソルを進め、その行から値を取得します。リスト・カーソルとともに使用すると、FETCH文によりカーソルがリスト内の指定された位置に配置され、そのリストの一部を取得します。FETCH文がプリコンパイルされたホスト言語プログラムに埋め込まれると、行からの値がホスト・パラメータに割り当てられます。対話型SQLでは、FETCH文によって端末画面に行の値が表示されます。

## 環境

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

> - 対話型SQL（USING DESCRIPTION句を除く）

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

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

## 形式

## 引数

> ### cursor-name

> ### parameter

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

> FETCH文が動的カーソルにアクセスしている場合のみ、パラメータを使用してカーソル名を参照できます。

> ### fetch-orientation-clause FROM

> フェッチするリスト・カーソルの特定のセグメントを指定します。これらのオプションは、DECLARE CURSOR文でSCROLLオプションを指定した場合にのみ指定できます。選択肢には次のものがあります。

> - NEXT
>   リスト・カーソルの次のセグメントをフェッチします。これはデフォルトです。

> - PRIOR
>   リスト・カーソルの現行セグメントの直前のセグメントをフェッチします。

> - FIRST
>   リスト・カーソルの最初のセグメントをフェッチします。

> - LAST
>   リスト・カーソルの最後のセグメントをフェッチします。

> - RELATIVE simple-value-expression
>   リスト・カーソルの値式が示すセグメントをフェッチします。たとえば、relative --4では、現行のセグメントの4つ前にあたるセグメントをフェッチします。

> - ABSOLUTE simple-value-expression
>   リスト・カーソルの値式が示すセグメントをフェッチします。たとえば、absolute 4はリスト・カーソルの第4のセグメントをフェッチします。

> ### INTO parameter

> ### INTO qualified-parameter

> ### INTO variable

> パラメータ、修飾パラメータ（ホスト構造体）または変数のリストを指定して、カーソルの結果表の行からSQLが取得する値を受け取ります。リスト内のパラメータまたは変数の数は、行内の値の数と同じである必要があります。（パラメータのいずれかがホスト構造体である場合、SQLでは、INTO句のホスト・パラメータの数を行内の値の数と比較する際、その構造体のパラメータの数をカウントします。）

> パラメータおよび変数のデータ型は、該当するカーソル行の列の値と互換性を持つ必要があります。

> ### simple-value-expression

> 正または負の整数、数値モジュール言語、ホスト言語パラメータのいずれかを指定します。

> ### USING DESCRIPTOR descriptor-name

> SQLDAに対応している記述子の名前を指定します。INCLUDE文を使用してプログラムにSQLDAを挿入する場合、記述子名にはそのままSQLDAが使用されます。

> SQLDAは、動的SQLでのみ使用されるホスト言語変数のコレクションです。FETCH文では、SQLDAは、行の値を保存するためにSQLで使用されるパラメータの数を指します。パラメータの数は、行の列数と一致している必要があります。

> パラメータのデータ型は、該当するカーソル行の列の値と互換性を持つ必要があります。

## 使用方法

> - カーソルに対してFETCH文を使用するには、最初にそのカーソルにOPEN文を発行する必要があります。

> - オープン・カーソルは次のように配置されます。

>   - その結果表の最初の行の前。SQLでOPEN文が実行されると、最初の行に前カーソルが配置されます。カーソルを参照しているDELETE文が実行されると、削除された行の直後の行の前にカーソルが配置されます。

>   - カーソルの結果表の行（最後の行を除くいずれかの行に対するFETCH文の実行後）。

>   - カーソルの結果表の最後の行の後。
>     表カーソルが最後の行に配置されると、そのカーソルのFETCH文またはDELETE文が最後の行の後にカーソルを配置します。

> - 次のような状況では、エラーが生成され、SQLCODEステータス・パラメータまたはSQLCAのSQLCODEフィールドが+100に設定され、SQLSTATEフィールドが'02000'に設定されます。

>   - FETCH文またはFETCH NEXT文でのカーソルの現在の位置がその結果表の最終行または最終行の後である場合。

>   - FETCH ABSOLUTE文またはFETCH RELATIVE文で範囲外の行を取得しようとしてしている場合。

>   - FETCH PRIOR文でのカーソルの現在の位置がその結果表の最初の行または最初の行の前である場合。

> - 要素より短いターゲット指定にリストの要素をフェッチしようとすると、その要素は切り捨てられます。SQLCAのSQLERRD配列の第6の要素は、要素とターゲット間の差異（切り捨てられたバイト数）に設定されます。

> - ホスト言語構造体を使用する場合は、必ずインジケータ配列を使用してください。インジケータ配列の詳細は、第2.2.13.2項または『Oracle Rdb7 Guide to SQL Programming』を参照してください。
>   SQLでリスト・カーソルをフェッチすると、インジケータ・パラメータの値によってセグメントが切り捨てられたかどうかが示されます。切捨てが発生していない場合は、インジケータ・パラメータの値は0です。リスト・セグメントの値がNULLの場合、インジケータ・パラメータの値は--1です。リスト・セグメントが切り捨てられている場合、SQLLENに切り捨てられていないセグメントの長さが保存されます。

> - フェッチされたセグメントの長さは、セグメントのSQLDAでVARCHARまたはVARBYTEフィールドを渡すと判別できます。SQLでは、この2つのデータ型の長さフィールドにセグメントの長さが返されます。

> - 必ずリスト・カーソルをクローズしてから表カーソルの次の行をフェッチするようにする必要があります。クローズしなかった場合でも、SQLではエラー・メッセージや警告は表示されません。