バージョン 6.3.3
 —  ステートメント  —

SELECT - SQL

このドキュメントでは、次のトピックについて説明します。


機能

SELECT ステートメントでは、任意の行数を取得するためのカーソル選択と、多くても 1 つの行を取得する非カーソル選択(単独 SELECT)の両方がサポートされています。

SELECT ... END-SELECT 構造で、Natural は FIND ステートメントと同じデータベースループ処理を使用します。

Top of page

構文説明

2 つの異なる構造が可能です。

構文 1 - カーソル選択

一般セットの構文

SELECT selection INTO

parameter,
VIEW {view-name [correlation-name]},

table-expression      

UNION

[ALL] [(]SELECT selection table-expression[)]

EXCEPT
INTERSECT
ORDER BY

integer

ASC
DESC

 
column-reference
expression
statement

END-SELECT (ストラクチャードモードのみ

         
LOOPレポーティングモードのみ

拡張セットの構文:

[WITH_CTE common-table-expression,...]
SELECT selection INTO

parameter,          
VIEW {view-name [correlation-name]},

UNION

[ALL] [(]SELECT selection table-expression[)]

EXCEPT
INTERSECT
ORDER BY

integer

ASC
DESC

 
column-reference
expression
INPUT SEQUENCE
[OPTIMIZE FOR integer ROWS]

WITH

CS

     
RR
UR
RS
RS KEEP UPDATE LOCKS
RR KEEP UPDATE LOCKS
QUERYNO integer

FETCH FIRST

1

ROW

ONLY

integer ROWS
[WITH HOLD]
[WITH RETURN]

WITH

ASENSITIVE SCROLL

[:]scroll_hv [GIVING [:] sqlcode

INSENSITIVE SCROLL
SENSITIVE STATIC SCROLL
SENSITIVE DYNAMIC SCROLL

WITH ROWSET POSITIONING FOR

[:] row_hv

ROWS

ROWS_RETURNED [:] ret_row

integer
[IF-NO-RECORDS-FOUND-clause]
statement

END-SELECT (ストラクチャードモードのみ

         
LOOPレポーティングモードのみ

構文要素の説明 - 構文 1:

SELECT selection FIND ステートメントと同様、カーソル選択は検索条件を基準に 1 つ以上のデータベーステーブルから行(レコード)のセットを選択するために使用します。 また、アプリケーションプログラムからのカーソル管理は必要なく、Natural によって自動的に処理されます。 詳細については、以下の「SELECT - カーソル指向」を参照してください。
INTO INTO 節は、選択の結果を格納するプログラム内のターゲットフィールドを指定するために使用します。 詳細と例については、以下の「INTO 節」を参照してください。
VIEW INTO 節で 1 つまたは複数のビューを参照する場合は、selection で指定した項目数が、ビューに定義されているフィールド(カウントするグループフィールドではなく、再定義フィールドとインジケータフィールド)の数と一致する必要があります。 詳細と例については、以下の「VIEW 節」を参照してください。
table-expression table-expression は、FROM 節とオプションの WHERE 節から成ります。 詳細と例については、以下の「table-expression」を参照してください。
UNION UNION は、複数の select-expressions の結果を結合します。 詳細と例については、以下の「UNION を伴うクエリ」を参照してください。
ORDER BY ORDER BY 節は、SELECT ステートメントの結果を特定の順序で整列します。 詳細と例については、以下の「ORDER BY 節」を参照してください。
IF NO RECORDS FOUND IF NO RECORDS FOUND 節は、先行する SELECT ステートメントで指定した選択条件に一致するレコードがない場合に処理ループを開始するために使用します。 詳細については、以下の「IF NO RECORDS FOUND 節」を参照してください。
END-SELECT SELECT ステートメントを終了するには、Natural の予約キーワード END-SELECT を使用する必要があります。

次の構文要素は SQL 拡張セットに含まれます。

OPTIMIZE FOR
OPTIMIZE FOR 節:

この節は DB2 データベースにのみ有効です。 他のデータベースに使用すると、ランタイムエラーが発生します。

WITH CS/RS/UR/...
WITH CS/RS/UR/...節:

この節は DB2 データベースにのみ有効です。 他のデータベースに使用すると、ランタイムエラーが発生します。

QUERYNO
QUERYNO 節:

この節は、現在はサポートされていないため無視されます。

FETCH FIRST
FETCH FIRST 節:

この節は DB2 データベースにのみ有効です。 他のデータベースに使用すると、ランタイムエラーが発生します。

WITH HOLD
WITH HOLD 節:

この節は現在サポートされていません。 使用すると、コンパイラエラーが発生します。

WITH RETURN
WITH RETURN 節:

この節は現在はサポートされていません。 使用すると、コンパイラエラーが発生します。

WITH ... SCROLL
WITH ... SCROLL 節:

この節は SQL 拡張セットに含まれます。 この節では、RDBMS のスクロール可能カーソルを有効にします。 スクロール可能カーソルには、ASENSITIVEINSENSITIVESENSITIVE STATIC、または SENSITIVE DYNAMIC を使用できます。

注意:
すべての SQL データベースシステムですべてのオプションがサポートされているわけではありません。

  • WITH ASENSITIVE SCROLL では、カーソルを INSENSITIVE または SENSITIVE DYNAMIC に指定します。 どちらが使用されるかは、カーソルのオープン時にその読み取り専用プロパティに基づいてデータベースによって決定されます。カーソルが読み取り専用の場合、カーソルは INSENSITIVE になります。 カーソルが読み取り専用でない場合、カーソルは SENSITIVE DYNAMIC になります。 これは、DB2 データベース用にサポートされています。

  • WITH INSENSITIVE SCROLL では、カーソルの更新後、基本テーブルを対象に実行される更新、削除、および挿入に対してカーソルを非センシティブにすることを指定します。 INSENSITIVE SCROLL カーソルに対しては、位置決め UPDATE および位置決め DELETE は許可されていません。 これは、Oracle、Adabas D、Informix、MS SQL Server ODBC、および DB2 データベース用にサポートされています。

  • WITH SENSITIVE STATIC では、カーソルのオープン後、基本テーブルを対象に実行される更新および削除(挿入は含まない)に対してカーソルをセンシティブにすることを指定します。 SENSITIVE STATIC SCROLL カーソルに対しては、位置決め UPDATE および位置決め DELETE が許可されています。 これは、Adabas D、MS SQL Server ODBC、および DB2 データベース用にサポートされています。

  • WITH SENSITIVE DYNAMIC では、カーソルのオープン後、基本テーブルを対象に実行される更新、削除、および挿入に対してカーソルをセンシティブにすることを指定します。 SENSITIVE DYNAMIC SCROLL カーソルに対しては、位置決め UPDATE および位置決め DELETE が許可されています。 これは、Adabas D、MS SQL Server ODBC、および DB2 データベース用にサポートされています。

スクロール可能カーソルにより、カーソルがオープンされている限り、アプリケーションでカーソル位置の任意の行をいつでも位置決めできるようになります。

スクロール可能カーソルは、Sybase データベースではサポートされていません。 スクロール可能カーソルは、MS SQL Server DBLIB インターフェイスではサポートされていませんが、MS SQL Server ODBC インターフェイスに限ってサポートされています。

位置決めは scroll_hv の内容に基づいて行われます。 内容は、データベースに対する FETCH が実行されるたびに評価されます。

詳細については、「SELECT - カーソル指向」を参照してください。

構文 2 - 非カーソル選択

一般セットの構文

SELECT SINGLE  
 
  selection INTO

parameter ,

table-expression
  VIEW {view-name [correlation-name ]},
   
  [IF-NO-RECORDS-FOUND-clause]
  statement
 

END-SELECT (structured mode only)

LOOP (reporting mode only)

拡張セットの構文

SELECT SINGLE  
 
  selection INTO

parameter ,

table-expression
  VIEW {view-name [correlation-name ]},
   
 

 

CS

 
  WITH RR  
    UR  
 
  [IF-NO-RECORDS-FOUND-clause]
  statement
 

END-SELECT (structured mode only)

LOOP (reporting mode only)

構文要素の説明 - 構文 2:

SELECT SINGLE SELECT SINGLE ステートメントでは、非カーソル選択(単独 SELECT)の機能、つまり、カーソルを使用せずに多くても 1 つの行を取得する選択式がサポートされています。 これは位置決め UPDATE位置決め DELETE ステートメントでは参照できません。
INTO INTO 節は、選択の結果を格納するプログラム内のターゲットフィールドを指定するために使用します。 詳細と例については、以下の「INTO 節」を参照してください。
VIEW INTO 節で 1 つまたは複数のビューを参照する場合は、selection で指定した項目数が、ビューに定義されているフィールド(カウントするグループフィールドではなく、再定義フィールドとインジケータフィールド)の数と一致する必要があります。 詳細と例については、以下の「VIEW 節」を参照してください。
table-expression table-expression は、FROM 節とオプションの WHERE 節から成ります。 詳細と例については、以下の「table-expression」を参照してください。
WITH CS/RR/UR
WITH CS/RR/UR 節:

この節は DB2 データベースにのみ有効です。 他のデータベースに使用すると、ランタイムエラーが発生します。

IF NO RECORDS FOUND  IF NO RECORDS FOUND 節は、先行する SELECT ステートメントで指定した選択条件に一致するレコードがない場合に処理ループを開始するために使用します。 詳細については、以下の「IF NO RECORDS FOUND 節」を参照してください。
END-SELECT SELECT ステートメントを終了するには、Natural の予約キーワード END-SELECT を使用する必要があります。

INTO 節

INTO

parameter ,

VIEW {view-name [correlation-name ]},

INTO 節は、選択の結果を格納するプログラム内のターゲットフィールドを指定するために使用します。 INTO 節では、DEFINE DATA ステートメントで定義された個々の parameters または 1 つ以上のビューを指定できます。

全ターゲットフィールドは単一テーブルまたはジョイン処理でできた複数のテーブルから値を受け取ることができます(「ジョインクエリ」も参照)。

注意:
標準 SQL 構文では、INTO 節は非カーソル選択処理(単独 SELECT)でのみ使用されるため、単一行を選択する場合にのみ指定できます。 ただし、Natural では、カーソル選択処理および非カーソル選択処理のどちらにも INTO 節を使用します。

selection はアスタリスク(*)のみでも構成できます。 標準選択式では、FROM 節に指定されたテーブル(複数可)の全列名のリストに対する省略形です。 ただし、同じ構文項目 SELECT * は、Natural SELECT ステートメントでは異なる意味になります。INTO 節にリストされた項目はすべて選択にも使用されます。 それらの名前は既存のデータベースの列名に対応させる必要があります。

例:

例 1:

DEFINE DATA LOCAL
01 PERS VIEW OF SQL-PERSONNEL  
  02 NAME
  02 AGE
END-DEFINE
...
SELECT *
  INTO NAME, AGE

例 2:

...
SELECT *
  INTO VIEW PERS 

上記の例は下記の例と同等です。

例 3:

...
SELECT NAME, AGE  
  INTO NAME, AGE

例 4:

...
SELECT NAME, AGE  
  INTO VIEW PERS

VIEW 節

VIEW {view-name [correlation-name]},

INTO 節で 1 つまたは複数のビューを参照する場合は、selection で指定した項目数が、ビューに定義されているフィールド(カウントするグループフィールドではなく、再定義フィールドとインジケータフィールド)の数と一致する必要があります。

注意:
Natural ターゲットフィールドおよびテーブルの列は両方とも Natural DDM に定義されている必要があります。 ただし、割り当ては順序に従って行われるため、名前が異なっていてもかまいません。

ビュー使用の INTO 節の例:

DEFINE DATA LOCAL
01 PERS VIEW OF SQL-PERSONNEL   
  02 NAME
  02 AGE
END-DEFINE
...
SELECT FIRSTNAME, AGE
  INTO VIEW PERS
  FROM SQL-PERSONNEL
...

ターゲットフィールド NAME および AGE は Natural ビューの一部であり、テーブルの列 FIRSTNAME および AGE の内容を受け取ります。

parameter

個々のパラメータをターゲットフィールドとして指定する場合、パラメータの数とフォーマットは、対応する選択(上記)に指定された columns または scalar-expressions(あるいは両方)の数とフォーマットに一致する必要があります(詳細については、「スカラー式」を参照)。

例:

DEFINE DATA LOCAL
01 #NAME   (A20)
01 #AGE    (I2)
END-DEFINE
...
SELECT NAME, AGE
  INTO #NAME, #AGE
  FROM SQL-PERSONNEL   
...

ターゲットフィールド #NAME および #AGE は Natural プログラム変数であり、テーブルの列 NAME および AGE の内容を受け取ります。

correlation-name

複数のテーブルが連結(ジョイン)される SELECT * 構造で VIEW 節を使用する場合、指定したビューに含まれるフィールドが複数のテーブルに存在する列を参照するのであれば、correlation-names が必要となります。 選択する列を識別するために、選択リスト生成時には、これらの列がすべて指定した correlation-name で修飾されます。 ビューに割り当てる correlation-name は、連結(ジョイン)されるテーブルを修飾するために使用される correlation-names の 1 つに対応している必要があります。 「ジョインクエリ」も参照してください。

例:

DEFINE DATA LOCAL
01 PERS VIEW OF SQL-PERSONNEL
  02 NAME
  02 FIRST-NAME
  02 AGE
END-DEFINE
...
SELECT *
  INTO VIEW PERS A
  FROM SQL-PERSONNEL A, SQL-PERSONNEL B  
...

table-expression

table-expression は、FROM 節とオプションの WHERE 節から成ります。 GROUP BY および HAVING 節は指定できません。

例 1:

DEFINE DATA LOCAL
01 #NAME      (A20)
01 #FIRSTNAME (A15)
01 #AGE       (I2)
...
END-DEFINE
...
SELECT NAME, FIRSTNAME, AGE
  INTO #NAME, #FIRSTNAME, #AGE
  FROM SQL-PERSONNEL
    WHERE NAME IS NOT NULL
      AND AGE > 20
...
  DISPLAY #NAME #FIRSTNAME #AGE   
END-SELECT
...
END

例 2:

DEFINE DATA LOCAL
01 #COUNT    (I4)
...
END-DEFINE
...
SELECT SINGLE COUNT(*) INTO #COUNT FROM SQL-PERSONNEL   
...

詳細については、selection および table-expression を参照してください。

UNION を伴うクエリ

注意:
以降において、"SELECT ステートメント" は、UNION 演算と連結した複数の選択式で構成されるクエリ式全体の同義語として使用されます。

UNION は、複数の select-expressions の結果を結合します。 各 select-expressions に指定された列は UNION 互換(数、タイプ、フォーマットが一致)である必要があります。

UNION 演算子に ALL 修飾子が明示的に指定されていないと、重複した余分な行は常に UNION の結果から取り除かれます。 ただし、UNION では、ALL に代わって明示的に指定できる DISTINCT オプションはありません。

例:

DEFINE DATA LOCAL
01 PERS VIEW OF SQL-PERSONNEL   
  02 NAME
  02 AGE
  02 ADDRESS (1:6)
END-DEFINE
...
SELECT NAME, AGE, ADDRESS
  INTO VIEW PERS
  FROM SQL-PERSONNEL
  WHERE AGE > 55
UNION ALL
SELECT NAME, AGE, ADDRESS
  FROM SQL-EMPLOYEES
  WHERE PERSNR < 100
ORDER BY NAME
...
END-SELECT
...

一般的に、任意の数の select-expressionsUNION で連結できます。

INTO 節は、最初の select-expression にのみ指定する必要があります。

ORDER BY 節は、最後の select-expression の後に指定する必要があります。並べ替える列は名前でなく番号で識別する必要があります。

ORDER BY 節

ORDER BY integer

ASC

,
column-reference DESC

ORDER BY 節は、SELECT ステートメントの結果を特定の順序で整列します。

ORDER BY 節には、結果テーブルの列を指定する必要があります。 ほとんどの ORDER BY 節で、column-reference(オプションで修飾された列名)、または列番号によって列を識別できます。 UNION を指定したクエリでは、列は列番号で識別する必要があります。 列番号は、selection 内で左から右へ位置づけ、integer 値で示します。 この機能により、名前を持たない計算列に基づいて結果を整列できるようになります。

例:

DEFINE DATA LOCAL
1 #NAME          (A20)
1 #YEARS-TO-WORK (I2)
END-DEFINE
...
SELECT NAME , 65 - AGE
  INTO #NAME, #YEARS-TO-WORK   
  FROM SQL-PERSONNEL
  ORDER BY 2
  ...

ORDER BY 節に指定する順序は昇順(ASC)または降順DESC)です。 ASC がデフォルトです。

例:

DEFINE DATA LOCAL
1 PERS VIEW OF SQL-PERSONNEL
1 NAME
1 AGE
1 ADDRESS   (1:6)
END-DEFINE
...
SELECT NAME, AGE, ADDRESS
  INTO VIEW PERS
  FROM SQL-PERSONNEL
  WHERE AGE = 55
  ORDER BY NAME DESC
  ...

詳細については、integer および column-reference を参照してください。

IF NO RECORDS FOUND 節

注意:
この節は実際には Natural SQL に属するものではありません。これは Natural 機能が SQL ループ処理に対して有効にされたことを表します。

ストラクチャードモード構文

IF NO [RECORDS] [FOUND]  

ENTER

statement
END- NOREC

レポーティングモード構文

IF NO [RECORDS] [FOUND]

ENTER

statement
DO statement DOEND

 IF NO RECORDS FOUND 節は、先行する SELECT ステートメントで指定した選択条件に一致するレコードがない場合に処理ループを開始するために使用します。

指定した選択条件に一致するレコードがない場合、IF NO RECORDS FOUND 節により、"空" のレコードを使用して処理ループが 1 回実行されます。 これが望ましくない場合は、IF NO RECORDS FOUND 節に ESCAPE BOTTOM ステートメントを指定します。

IF NO RECORDS FOUND 節に 1 つ以上のステートメントを指定すると、処理ループに入る直前にそのステートメントが実行されます。 ループに入る前に実行するステートメントがない場合は、キーワード ENTER を使用する必要があります。

注意:
SELECT ステートメントの結果セットが単一行の NULL 値で構成される場合、IF NO RECORDS FOUND 節は実行されません。 この状況は、選択リストが列に対する集積関数 SUMAVGMINMAX の 1 つで単独に構成され、集積関数で使用するセットが空の場合に起こることがあります。 このような方法で集積関数を使用するときは、IF NO RECORDS FOUND 節を使用せずに、対応する空値インジケータフィールドの値をチェックする必要があります。

データベース値

IF NO RECORDS FOUND 節内のステートメントで他の値の割り当てが行われない限り、Natural は現在のループで指定されたファイルを参照するすべてのデータベースフィールドをリセットして空にします。

システム機能の評価

Natural システム機能は、IF NO RECORDS FOUND 節の結果として処理用に作成される空のレコードに対して 1 回評価されます。

Top of page

ジョインクエリ

ジョインとは複数のテーブルからデータを取得するクエリです。 参照されるテーブルはすべて FROM 節に指定する必要があります。

例:

DEFINE DATA LOCAL
1 #NAME     (A20)
1 #MONEY    (I4)
END-DEFINE
...
SELECT NAME, ACCOUNT
  INTO #NAME, #MONEY
  FROM  SQL-PERSONNEL P, SQL-FINANCE F   
  WHERE P.PERSNR = F.PERSNR
    AND F.ACCOUNT > 10000
    ...

ジョインは常に FROM 節にリストされたテーブルのデカルト積を形成し、このデカルト積から WHERE 節に指定されたジョイン条件を満たさない行をすべて削除します。

テーブル名が長すぎる場合、 Correlation-names を使用して書き込みを保存できます。 選択リストに指定された列が、連結(ジョイン)される複数のテーブルに存在するとき、同じ名前のどの列を選択するかを識別するために Correlation-names を使用する必要があります。

Top of page

SELECT - カーソル指向

Natural FIND ステートメントと同様、カーソル指向の SELECT ステートメントは検索条件を基準に 1 つ以上の DB2 テーブルから行(レコード)のセットを選択するために使用します。 データベースループが開始されるため、ループは LOOP(レポーティングモード)または END-SELECT ステートメントで閉じる必要があります。 この構造では、Natural は FIND ステートメントの場合と同じ処理ループを使用します。

また、アプリケーションプログラムからのカーソル管理は必要なく、Natural によって自動的に処理されます。

以下に参考情報を示します。

OPTIMIZE FOR integer ROWS

[OPTIMIZE FOR integer ROWS]

OPTIMIZE FOR integer ROWS 節は、結果テーブルから取得する行の数(integer)を前もって DB2 に知らせるために使用します。 この節を使用しない場合、DB2 では結果テーブルのすべての行が取得されると仮定し、それに応じて最適化を行います。

このオプションの節は、選択される行の数を把握している場合に役立ちます。実際に選択される行数が integer 値(0~2147483647)を超えない場合、integer の行を最適化することでパフォーマンスが向上します。

例:

SELECT name INTO 
#name FROM table WHERE AGE = 2 OPTIMIZE FOR 100 ROWS

WITH - 分離レベル

WITH

CS
RR
RR KEEP UPDATE LOCK
RS
RS KEEP UPDATE LOCKS
UR

この WITH 節では、ステートメントを実行するときの分離レベルを明示的に指定できます。 次のオプションを使用できます。

オプション 意味
CS カーソルの安定
RR 繰り返し可能な読み込み
RS 読み込みの安定
RS KEEP UPDATE LOCKS FOR UPDATE OF 節を指定している場合にのみ有効です。

読み込みの安定と更新ロックの保持です。

RR KEEP UPDATE LOCKS FOR UPDATE OF 節を指定している場合にのみ有効です。

繰り返し可能な読み込みと更新ロックの保持です。

UR 未コミットの読み込み

WITH UR は、テーブルが読み取り専用のときに SELECT ステートメント内にのみ指定できます。 デフォルトの分離レベルは、ステートメントがバインドされるパッケージまたはプランの分離によって決定されます。 また、デフォルトの分離レベルは、結果テーブルが読み取り専用かどうかによっても変わります。 デフォルトの分離レベルについては、IBM 文献を参照してください。

注意:
また、このオプションは非カーソル選択にのみ有効です。

FETCH FIRST

FETCH FIRST

1
integer

ROWS
ROW

ONLY

FETCH FIRST 節では、フェッチする行の数を制限します。 ごく限られた数の行が必要な場合にこの節を使用すると、結果セットの規模が大きくなる可能性のあるクエリのパフォーマンスが向上します。

WITH INSENSITIVE/SENSITIVE

WITH

ASENSITIVE SCROLL
INSENSITIVE SCROLL
SENSITIVE STATIC SCROLL
SENSITIVE DYNAMIC SCROLL

[:] scroll_hv [GIVING [:] sqlcode]

Natural では、SQL のスクロール可能カーソルを利用できます。そのためには、WITH ASENSITIVE SCROLL 節、WITH SENSITIVE STATIC SCROLL 節、および SENSITVE DYNAMIC SCROLL 節を使用します。 スクロール可能カーソルにより、Natural アプリケーションで結果セット内の任意の行をランダムに位置決めできるようになります。 スクロール不可能なカーソルでは、データは上から下に順番に読み込むことしかできません。

ASENSITIVE スクロール可能カーソルは、INSENSITIVE(カーソルが READ-ONLY の場合)または SENSITIVE DYNAMIC(カーソルが READ-ONLY でない場合)です。

INSENSITIVE および SENSITIVE STATIC スクロール可能カーソルでは一時的な結果テーブルを使用し、DB2 に TEMP データベースが必要になります(IBM の関連 DB2 文献を参照)。

INSENSITIVE SCROLL は、位置決め UPDATE または位置決め DELETE 処理に使用できないカーソルを表します。 また、INSENSITIVE SCROLL カーソルは、一度オープンされると、その後に基本テーブルを対象に実行される UPDATEDELETE、または INSERT を反映しません。

SENSITIVE STATIC SCROLL は、位置決め UPDATE または位置決め DELETE 処理に使用できるカーソルを表します。 また、SENSITIVE STATIC SCROLL カーソルは、基本テーブルの行の UPDATEDELETE を反映します。 ただし、INSERT 処理は反映しません。

SENSITIVE DYNAMIC スクロール可能カーソルは、カーソルがオープンされている間、基本テーブルを対象に実行される UPDATEDELETE、および INSERT を反映します。

以下に参考情報を示します。

scroll_hv

変数 scroll_hv は英数字にする必要があります。

変数 scroll_hv では、データベース処理ループの 1 回の実行でフェッチする結果テーブルの行を指定します。 scroll_hv の内容は、データベース処理ループサイクルが実行されるたびに評価されます。

INSENSITIVE
SENSITVE

CURRENT
FIRST
LAST
PRIOR
NEXT | N
 

         

ABSOLUTE
RELATIVE

[+ | - ] integer

scroll_hv - オプション

オプション 説明
CURRENT 現在の行を(再度)フェッチします。
FIRST 最初の行をフェッチします。
LAST 最後の行をフェッチします。
NEXT 現在の行の次の行をフェッチします。 これはデフォルト値です。
PRIOR 現在の行の前の行をフェッチします。
+/- integer

ABSOLUTE または RELATIVE との接続でのみ適用されます。

フェッチする行の位置を ABSOLUTE または RELATIVE で指定します。

整数の前にプラス記号(+)またはマイナス記号(-)を入力します。

デフォルト値はプラス(+)です。

ABSOLUTE

+/- integer との接続でのみ適用されます。

行をフェッチする結果セット内の絶対位置として integer を使用します。

RELATIVE

+/- integer との接続でのみ適用されます。

行をフェッチする結果セット内の現在の位置への相対位置として integer を使用します。

特別な RDBMS システムにはいくつかの制限があります。

GIVING [:] sqlcode

GIVING [:] sqlcode の指定はオプションです。 指定する場合、Natural 変数 [:] sqlcode のフォーマットは I4 にする必要があります。 この変数の値は、基準となる FETCH 処理の DB2 SQLCODE から返されます。 これにより、スクロール可能カーソルがオープンされている間に発生した各種ステータスにアプリケーションで対応できるようになります。 SQLCODE で示される最も重要なステータスコードを次の表に示します。

SQLCODE 説明
0 FETCH 処理は正常に完了しました。データが返されました(ただし、オプション BEFORE または AFTER を指定した FETCH を除く)。
+100 行は見つかりません。カーソルはオープンされたままです。データは返されませんでした。
-1 行に対する FETCH 試行中の一般的なエラーです。

GIVING [:] sqlcode を指定する場合、アプリケーションで各種ステータスに対応できる必要があります。 端末 I/O なしで 5 回連続して SQLCODE +100 になった場合、アプリケーションループを回避するために、NDB ランタイムから Natural エラー NAT3296 が発行されます。 アプリケーションでは、ESCAPE ステートメントを実行して処理ループを終了できます。

GIVING [:] sqlcode を指定しない場合、SQLCODE 0 および SQLCODE +100 を除き、各 SQLCODE によって Natural エラー NAT3700 が生成され、処理ループが終了します。 SQLCODE +100(行は見つかりません)では処理ループが終了します。

Natural システムライブラリ SYSDB2 内のプログラム例 DEM2SCRL も参照してください。

Top of page