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

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 FORinteger 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 拡張セットに含まれます。

WITH_CTE common-table-expression,...
WITH_CTE common-table-expression:

このオプションの節では、後に続く SELECT ステートメントの任意の FROM 節で参照できる結果テーブルを定義できます。 単一の WITH_CTE キーワードに続けて複数の共通テーブル式を指定できます。 それぞれの共通テーブル式は、後続の共通テーブル式の FROM 節でも参照できます。

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

OPTIMIZE FOR
OPTIMIZE FOR 節:

詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」を参照してください。

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

この節では、ステートメントを実行するときの分離レベルを明示的に指定できます。 この節の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「ステートメントとシステム変数」を参照してください。

QUERYNO
QUERYNO 節:

QUERYNO 節では、この SQL ステートメントの EXPLAIN 出力とトレースレコードで使用される番号を指定します。 この節の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「ステートメントとシステム変数」を参照してください。

FETCH FIRST
FETCH FIRST 節:

この節では、フェッチできる行の数を制限します。 この節の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「ステートメントとシステム変数」を参照してください。

WITH HOLD
WITH HOLD 節:

詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で対応するセクションを参照してください。

WITH RETURN
WITH RETURN 節:

詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で対応するセクションを参照してください。

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

この節では、DB2 のスクロール可能カーソルを有効にします。 スクロール可能カーソルには、ASENSITIVEINSENSITIVESENSITIVE STATIC、または SENSITIVE DYNAMIC を使用できます。

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

  • WITH INSENSITIVE SCROLL では、カーソルの更新後、基本テーブルを対象に実行される更新、削除、および挿入に対してカーソルを非センシティブにすることを指定します。 INSENSITIVE SCROLL カーソルに対しては、位置決め UPDATE および位置決め DELETE は許可されていません。

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

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

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

位置決めは scroll_hv の内容に基づいて行われます。 内容は、DB2 に対する 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 ステートメントでは参照できません。 詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」の「SELECT SINGLE - Non-Cursor-Oriented」を参照してください。
INTO INTO 節は、選択の結果を格納するプログラム内のターゲットフィールドを指定するために使用します。 詳細と例については、以下の「INTO 節」を参照してください。
VIEW INTO 節で 1 つまたは複数のビューを参照する場合は、selection で指定した項目数が、ビューに定義されているフィールド(カウントするグループフィールドではなく、再定義フィールドとインジケータフィールド)の数と一致する必要があります。 詳細と例については、以下の「VIEW 節」を参照してください。
table-expression table-expression は、FROM 節とオプションの WHERE 節から成ります。 詳細と例については、以下の「table-expression」を参照してください。
WITH CS/RR/UR
WITH CS/RR/UR 節:

この節では、ステートメントを実行するときの分離レベルを明示的に指定できます。 この節の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for 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 によって自動的に処理されます。

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

WITH_CTE common-table-expression,…

この節では、後に続く SELECT ステートメントの任意の FROM 節で参照できる結果テーブルを定義できます。

Natural 固有のキーワード WITH_CTE は、SQL キーワード WITH に対応します。 WITH_CTE は、Natural コンパイラにより SQL キーワード WITH に変換されます。

共通テーブル式はいずれも、次の構文に従っている必要があります。

[common-table-expression-name [(column-name,…)] AS (fullselect) ]

構文の説明:

common-table-expression-name 修飾されていない SQL 識別子である必要があります。また、同じステートメント内で指定されている他の共通テーブル式とは異なっている必要があります。

common-table-expression-name はいずれも、後に続く任意の common-table-expression-nameFROM 節、または後に続く SELECT ステートメントの FROM 節の中で指定できます。

column-name 修飾されていない SQL 識別子である必要があります。また、1 つの common-table-expression-name 内で一意である必要があります。
AS (fullselect) column-names の数は、fullselect の列の数と一致している必要があります。

共通テーブル式は、次のような場合に使用できます。

反復を使用するクエリは、材料の請求書などの用途に便利です。

例:

WITH_CTE                                                        
 RPL (PART,SUBPART,QUANTITY) AS                                 
 (SELECT ROOT.PART,ROOT.SUBPART,ROOT.QUANTITY                   
    FROM HGK-PARTLIST ROOT                                      
   WHERE ROOT.PART ='01'                                       
  UNION ALL                                                     
  SELECT CHILD.PART,CHILD.SUBPART,CHILD.QUANTITY                
    FROM  RPL PARENT, HGK-PARTLIST CHILD                        
    WHERE PARENT.SUBPART = CHILD.PART                            
  )                                                             
SELECT DISTINCT PART,SUBPART,QUANTITY                           
  INTO VIEW V1                                                  
  FROM RPL                                                      
  ORDER BY PART,SUBPART,QUANTITY                                
END-SELECT 

OPTIMIZE FOR integer ROWS

[OPTIMIZE FOR integerROWS]

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 文献を参照してください。

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

QUERYNO

[QUERYNOinteger]

QUERYNO 節では、この SQL ステートメントの EXPLAIN 出力とトレースレコードで使用される番号を指定します。 番号は、このステートメントの情報を含む行の PLAN_TABLETQUERYNO 列として使用されます。

FETCH FIRST

FETCH FIRST

1
integer

ROWS
ROW

ONLY

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

WITH HOLD

[WITH HOLD]

WITH HOLD 節は、データベースループ内のコミット処理によってカーソルがクローズされないようにするために使用します。 WITH HOLD を指定した場合、コミット処理により現在の作業論理ユニットの更新はすべてコミットされますが、この際、カーソルを維持する必要のないロックしか解放されません。 この節は、主にバッチモードで役立ちます。CICS 擬似会話型モードおよび IMS メッセージドリブンプログラムでは無視されます。

例:

SELECT name INTO #name FROM table
WHERE AGE = 2 WITH HOLD

WITH RETURN

[WITH RETURN]

WITH RETURN 節は、結果セットを作成するために使用します。 したがって、この節は Natural ストアドプロシージャとして動作するプログラムにのみ適用されます。 SELECT ステートメントに WITH RETURN 節を指定した場合、関連する処理ループを抜けたときに基準となるカーソルがオープンのまま維持されます。ただし、処理ループで結果セット自体のすべての行が読み込まれた場合を除きます。 処理ループの最初の実行時には、カーソルのみがオープンされます。 最初の行はまだフェッチされません。 これにより、Natural プログラムはストアドプロシージャの呼び出し元に完全な結果セットを返すことができます。 Natural ストアドプロシージャで処理する行の数、およびストアドプロシージャの呼び出し元に返す結果セットの未処理の行の数は自由に決めることができます。 Natural ストアドプロシージャで選択処理の行を処理する場合、次を定義する必要があります。

IF *counter =1 ESCAPE TOP END-IF

これにより、処理ループで最初の "空の行" が処理されることがなくなります。 行の処理を終了する場合、次を定義する必要があります。

If condition ESCAPE BOTTOM END-IF

この定義は処理ループで行います。

プログラムで結果セットのすべての行を読み込む場合、カーソルはクローズされ、この SELECT WITH RETURN に対する結果セットはストアドプロシージャの呼び出し元には返されません。

次にプログラムの例を示します。例 1 では完全な結果セットを取得し、例 2 では部分的な結果セットを取得しています。

例 1:

DEFINE DATA LOCAL
. . .
END DEFINE
*
*  Return all rows of the result set
*
SELECT * INTO VIEW V2 
                    FROM SYSIBM-SYSROUTINES
                    WHERE RESULT_SETS > 0
                    WITH RETURN
ESCAPE BOTTOM 
END-SELECT
END

例 2:

DEFINE DATA LOCAL
. . .
END DEFINE
*
*  Read the first two rows and return the rest as result set
*
SELECT * INTO VIEW V2 
                    FROM SYSIBM-SYSROUTINES
                    WHERE RESULT_SETS > 0
                    WITH   RETURN
WRITE PROCEDURE *COUNTER
IF *COUNTER = 1 ESCAPE TOP END-IF
IF *COUNTER = 3 ESCAPE BOTTOM END-IF
END-SELECT
END

WITH INSENSITIVE/SENSITIVE

WITH

ASENSITIVE SCROLL
INSENSITIVE SCROLL
SENSITIVE STATIC SCROLL
SENSITIVE DYNAMIC SCROLL

[:] scroll_hv [GIVING [:] sqlcode]

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

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 回の実行でフェッチする結果テーブルの行を指定します。 また、FETCH 処理中に基本テーブルを対象に実行される UPDATE または DELETE に対する感度を指定します。 scroll_hv の内容は、データベース処理ループサイクルが実行されるたびに評価されます。

INSENSITIVE
SENSITVE

AFTER
BEFORE

CURRENT
FIRST
LAST
PRIOR
NEXT | N
 

         

ABSOLUTE
RELATIVE

[+ | - ] integer

scroll_hv - 感度指定

感度 INSENSITIVE または SENSITIVE の指定はオプションです。

INSENSITIVE SCROLL カーソルに対する FETCH から省略した場合、デフォルトで INSENSITIVE が使用されます。

SENSITIVE STATIC/DYNAMIC SCROLL カーソルに対する FETCH から省略した場合、デフォルトで SENSITIVE が使用されます。

感度では、スクロール可能カーソルに対する FETCH 処理の実行時に基本テーブル内の行をチェックするかどうかを指定します。

対応する基本テーブルの列が WHERE 節の対象であり、削除されなかった場合、SENSITIVE FETCH によって基本テーブルの行が返されます。

対応する基本テーブルの列が WHERE 節の対象でない場合、または削除されなかった場合、SENSITIVE FETCH によって UPDATE ホール状態または DELETE ホール状態(SQLCODE +222)が返されます。

INSENSITIVE FETCH では、対応する基本テーブルの列はチェックされません。

scroll_hv - オプション

フェッチする行、フェッチの開始位置、およびスクロール方向を決定するためのオプションについて次に説明します。

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

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

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

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

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

ABSOLUTE

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

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

正または負の位置番号の詳細については、IBM 提供の DB2 SQL リファレンスを参照してください。

RELATIVE

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

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

正または負の位置番号の詳細については、IBM 提供の DB2 SQL リファレンスを参照してください。

GIVING [:] sqlcode

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

SQLCODE 説明
0 FETCH 処理は正常に完了しました。データが返されました(ただし、オプション BEFORE または AFTER を指定した FETCH を除く)。
+100 行は見つかりません。カーソルはオープンされたままです。データは返されませんでした。
+222 UPDATE または DELETE ホールです。カーソルはオープンされたままです。データは返されませんでした。 基本テーブルの対応する行が更新または削除されました。そのため、行は WHERE 節の対象ではなくなりました。
+231 オプション CURRENT を指定したフェッチ処理ですが、カーソルが行に位置づけられていません。データは返されませんでした。 これは前の FETCH によって SQLCODE +100 が返された場合に発生します。

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