Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

FETCH

カーソルからデータを取り出します。

Synopsis

FETCH cursor-name [INTO host-variable-list]

引数

cursor-name 現在オープンしているカーソルの名前。カーソル名は DECLARE 文で指定されています。カーソル名は、大文字と小文字を区別します。
INTO host-variable-list オプション — フェッチの列からローカル変数にデータをコピーします。host-variable-list には、1 つのホスト変数またはコンマで区切られた複数のホスト変数のリストを指定します。この変数がカーソルに関連付けられたデータの格納先になります。INTO 節は、オプションです。指定されていない場合は、FETCH 文はカーソルのみを配置します。

概要

埋め込み SQL アプリケーション内で、FETCH 文はカーソルからデータを取り出します。操作の必須順序は、DECLAREOPENFETCHCLOSE です。オープンしていないカーソルに FETCH を実行すると、SQLCODE -102 エラーが返されます。

SQL 文として埋め込み SQL からだけサポートされています。同様の操作は、ODBC でも ODBC API を使用してサポートされます。詳細は、"Caché SQL の使用法" の "埋め込み SQL" の章を参照してください。

INTO 節は、DECLARE 文の節、FETCH 文の節、またはその両方として指定できます。INTO 節は、ローカルホスト変数内に、フェッチの列からデータを配置します。リスト内の各ホスト変数は左から右に、カーソル結果セット内で対応する列に関連しています。各変数のデータ型は、結果セット列に対応するデータ型の暗黙の変換に一致するかサポートされる必要があります。変数の数は、カーソル選択リスト内の列数と一致しなければなりません。

FETCH 操作は、カーソルがデータの最後に達したときに完了します。このとき、SQLCODE=100 (これ以上データがない) に設定されます。また、%ROWCOUNT 変数もフェッチした行数に設定されます。

Note:

INTO 節のホスト変数から返される値は、SQLCODE=0 の場合のみ信頼できます。SQLCODE=100 (これ以上データがない) の場合は、ホスト変数の値は使用しないでください。

cursor-name はネームスペース固有ではありません。現在のネームスペースを変更しても、宣言されたカーソルの使用には影響はありません。ネームスペースで考慮する必要がある唯一の点は、FETCH は、クエリ対象のテーブルを含むネームスペースで行う必要があるということです。

FETCH では、#SQLCompile Mode=Deferred プリプロセッサ指示文はサポートされていません。Deferred モードを DECLAREOPENFETCH、または CLOSE カーソル文で使用しようとすると、#5663 コンパイル・エラーが生成されます。

%ROWID

FETCH が更新可能なカーソルの行を取得すると、%ROWID がフェッチされた行の RowID 値に設定されます。更新可能なカーソルとは、最上位の FROM 節にテーブル名か更新可能なビュー名のいずれかの要素が 1 つだけ含まれるカーソルのことです。

取得される各行の %ROWID の設定には、以下の条件が適用されます。

  • DECLARE cursorname CURSOR 文と OPEN cursorname 文では %ROWID は初期化されないため、%ROWID 値は以前の値から変更されません。FETCH が初めて正常に実行されると、%ROWID が設定されます。行を取得する後続の各 FETCH は、%ROWID を現在の RowID にリセットします。FETCH は、更新可能なカーソルの行を取得すると、%ROWID を設定します。カーソルが更新可能でない場合、%ROWID は変更されません。クエリ選択条件に一致する行がない場合、FETCH は %ROWID 値を変更しません。CLOSE 時、または FETCH が SQLCODE 100 (データがない、またはこれ以上データがない) を発行すると、%ROWID には取得された最後の行の RowID が含まれます。

  • カーソル・ベースの SELECTDISTINCT キーワードまたは GROUP BY 節を使用すると、%ROWID は設定されません。%ROWID 値に以前の値がある場合、%ROWID 値はその値から変更されません。

  • 集約演算のみを実行するカーソル・ベースの SELECT では、%ROWID は設定されません。%ROWID 値に以前の値がある場合、%ROWID 値はその値から変更されません。

カーソルが宣言されていない埋め込み SQL SELECT では、%ROWID は設定されません。%ROWID 値は単純な SELECT 文の完了時に未変更のままとなります。

UPDATE または DELETE の FETCH

FETCH を使用して、更新または削除する行を取得できます。UPDATE または DELETE では、WHERE CURRENT OF 節を指定する必要があります。DECLARE では FOR UPDATE 節を使用する必要があります。以下の例は、選択された行をすべて削除するカーソル・ベースの削除を示しています。

  ZN "Samples"
  &sql(DECLARE MyCursor CURSOR FOR SELECT %ID,Status
       FROM Sample.Quality WHERE Status='Bad' FOR UPDATE)
  &sql(OPEN MyCursor)
  NEW SQLCODE,%ROWCOUNT,%ROWID
  FOR {&sql(FETCH MyCursor)  QUIT:SQLCODE'=0
       &sql(DELETE FROM Sample.Quality WHERE CURRENT OF MyCursor) }
  WRITE !,"Number of rows updated=",%ROWCOUNT
  &sql(CLOSE MyCursor)

以下の埋め込み SQL の例は、EmpCursor という名前のカーソルからデータを取り出す引数なしの FOR ループによって呼び出された FETCH を示しています。INTO 節は DECLARE 文に指定されています。

    &sql(DECLARE EmpCursor CURSOR FOR 
        SELECT Name, Home_State
        INTO :name,:state FROM Sample.Employee
        WHERE Home_State %STARTSWITH 'M')
   &sql(OPEN EmpCursor)
   NEW SQLCODE,%ROWCOUNT,%ROWID
   FOR { &sql(FETCH EmpCursor)
        QUIT:SQLCODE'=0  
        WRITE "count: ",%ROWCOUNT," RowID: ",%ROWID,!
        WRITE "  Name=",name," State=",state,! }
   WRITE !,"Final Fetch SQLCODE: ",SQLCODE
   &sql(CLOSE EmpCursor)

以下の埋め込み SQL の例は、EmpCursor という名前のカーソルからデータを取り出す引数なしの FOR ループによって呼び出された FETCH を示しています。INTO 節は、FETCH 文の一部として指定されています。

   &sql(DECLARE EmpCursor CURSOR FOR 
        SELECT Name,Home_State FROM Sample.Employee
        WHERE Home_State %STARTSWITH 'M')
   &sql(OPEN EmpCursor)
   FOR { &sql(FETCH EmpCursor INTO :name,:state)
        QUIT:SQLCODE'=0  
        WRITE "count: ",%ROWCOUNT," RowID: ",%ROWID,!
        WRITE "  Name=",name," State=",state,! }
   WRITE !,"Final Fetch SQLCODE: ",SQLCODE
   &sql(CLOSE EmpCursor)

以下の埋め込み SQL の例は、WHILE ループを使用して呼び出された FETCH を示しています。

  &sql(DECLARE C1 CURSOR FOR 
        SELECT Name,Home_State INTO :name,:state FROM Sample.Person
        WHERE Home_State %STARTSWITH 'M')
   &sql(OPEN C1)
   &sql(FETCH C1)
   WHILE (SQLCODE = 0) {
        WRITE "count: ",%ROWCOUNT," RowID: ",%ROWID,!
        WRITE "  Name=",name," State=",state,!
        &sql(FETCH C1) }
   WRITE !,"Final Fetch SQLCODE: ",SQLCODE
   &sql(CLOSE C1)

以下の埋め込み SQL の例は、集約関数値を取得する FETCH を示しています。%ROWID は設定されていません。

    &sql(DECLARE PersonCursor CURSOR FOR 
        SELECT COUNT(*),AVG(Age) FROM Sample.Person )
   &sql(OPEN PersonCursor)
   NEW SQLCODE,%ROWCOUNT
   FOR { &sql(FETCH PersonCursor INTO :cnt,:avg)
        QUIT:SQLCODE'=0  
        WRITE %ROWCOUNT," Num People=",cnt," Average Age=",avg,! }
   WRITE !,"Final Fetch SQLCODE: ",SQLCODE
   &sql(CLOSE PersonCursor)

以下の埋め込み SQL の例は、DISTINCT 値を取得する FETCH を示しています。%ROWID は設定されていません。

    &sql(DECLARE EmpCursor CURSOR FOR 
        SELECT DISTINCT Home_State FROM Sample.Employee
        WHERE Home_State %STARTSWITH 'M'
        ORDER BY Home_State )
   &sql(OPEN EmpCursor)
   NEW SQLCODE,%ROWCOUNT
   FOR { &sql(FETCH EmpCursor INTO :state)
        QUIT:SQLCODE'=0  
        WRITE %ROWCOUNT," State=",state,! }
   WRITE !,"Final Fetch SQLCODE: ",SQLCODE
   &sql(CLOSE EmpCursor)

以下の埋め込み SQL の例は、複数ネームスペース間でカーソルが持続することを示しています。このカーソルは SAMPLES で宣言され、DOCBOOK でオープンされ、SAMPLES でフェッチされ、USER でクローズされます。FETCH は、クエリされるテーブル Sample.Employee を含むネームスペースで実行する必要があることに注意してください。

    &sql(USE DATABASE "USER")
    WRITE $ZNSPACE,!
  &sql(DECLARE NSCursor CURSOR FOR SELECT Name INTO :name FROM Sample.Employee)
    &sql(USE DATABASE DOCBOOK)
    WRITE $ZNSPACE,!
  &sql(OPEN NSCursor)
    WRITE "Open SQLCODE: ",SQLCODE,!
    &sql(USE DATABASE SAMPLES)
    WRITE $ZNSPACE,!
      NEW SQLCODE,%ROWCOUNT,%ROWID
 FOR { &sql(FETCH NSCursor)
       QUIT:SQLCODE  
       WRITE "Name=",name,! }
    &sql(USE DATABASE "USER")
    WRITE $ZNSPACE,!
  &sql(CLOSE NSCursor)
    WRITE "Close SQLCODE: ",SQLCODE,!

関連項目

FeedbackOpens in a new tab