このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連機能グループ:「データベースへのアクセスと更新」
『データベース管理システムインターフェイス』ドキュメントの次のセクションも参照してください。
「Natural for DB2」の「SELECT SINGLE - Non-Cursor-Oriented」
「Natural for SQL/DS」の「SELECT」
SELECT
ステートメントでは、任意の行数を取得するためのカーソル選択と、多くても 1 つの行を取得する非カーソル選択(単独 SELECT
)の両方がサポートされています。
SELECT ... END-SELECT
構造で、Natural は FIND
ステートメントと同じデータベースループ処理を使用します。
2 つの異なる構造が可能です。
一般セットの構文
SELECT selection INTO
|
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 拡張セットに含まれます。
WITH_CTE common-table-expression,... |
WITH_CTE common-table-expression:
このオプションの節では、後に続く 詳細については、以下の「SELECT - カーソル指向」を参照してください。 |
---|---|
OPTIMIZE FOR |
OPTIMIZE FOR 節:
詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」を参照してください。 |
WITH CS/RS/UR/... |
WITH CS/RS/UR/...節:
この節では、ステートメントを実行するときの分離レベルを明示的に指定できます。 この節の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「ステートメントとシステム変数」を参照してください。 |
QUERYNO |
QUERYNO 節:
|
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 のスクロール可能カーソルを有効にします。 スクロール可能カーソルには、
スクロール可能カーソルにより、カーソルがオープンされている限り、アプリケーションでカーソル位置の任意の行をいつでも位置決めできるようになります。 位置決めは scroll_hv の内容に基づいて行われます。 内容は、DB2 に対する 詳細については、「SELECT - カーソル指向」を参照してください。 |
一般セットの構文
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 |
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-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 ... ターゲットフィールド |
---|---|
correlation-name |
複数のテーブルが連結(ジョイン)される 例: 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 は、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 を参照してください。
注意:
以降において、"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-expressions を UNION
で連結できます。
INTO
節は、最初の select-expression にのみ指定する必要があります。
ORDER BY
節は、最後の select-expression の後に指定する必要があります。並べ替える列は名前でなく番号で識別する必要があります。
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 を参照してください。
注意:
この節は実際には 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
節は実行されません。 この状況は、選択リストが列に対する集積関数 SUM
、AVG
、MIN
、MAX
の 1 つで単独に構成され、集積関数で使用するセットが空の場合に起こることがあります。 このような方法で集積関数を使用するときは、IF NO RECORDS FOUND
節を使用せずに、対応する空値インジケータフィールドの値をチェックする必要があります。
IF NO RECORDS FOUND
節内のステートメントで他の値の割り当てが行われない限り、Natural は現在のループで指定されたファイルを参照するすべてのデータベースフィールドをリセットして空にします。
Natural システム機能は、IF NO RECORDS FOUND
節の結果として処理用に作成される空のレコードに対して 1 回評価されます。
ジョインとは複数のテーブルからデータを取得するクエリです。 参照されるテーブルはすべて 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 を使用する必要があります。
Natural FIND
ステートメントと同様、カーソル指向の SELECT
ステートメントは検索条件を基準に 1 つ以上の DB2 テーブルから行(レコード)のセットを選択するために使用します。 データベースループが開始されるため、ループは LOOP
(レポーティングモード)または END-SELECT
ステートメントで閉じる必要があります。 この構造では、Natural は FIND
ステートメントの場合と同じ処理ループを使用します。
また、アプリケーションプログラムからのカーソル管理は必要なく、Natural によって自動的に処理されます。
以下に参考情報を示します。
この節では、後に続く 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 識別子である必要があります。また、同じステートメント内で指定されている他の共通テーブル式とは異なっている必要があります。
|
column-name |
修飾されていない SQL 識別子である必要があります。また、1 つの common-table-expression-name 内で一意である必要があります。
|
AS (fullselect) |
column-names の数は、fullselect の列の数と一致している必要があります。
|
共通テーブル式は、次のような場合に使用できます。
ビューの作成を回避するため、ビューの代わりとして使用する場合
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 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 |
CS
|
この WITH
節では、ステートメントを実行するときの分離レベルを明示的に指定できます。 次のオプションを使用できます。
オプション | 意味 |
---|---|
CS | カーソルの安定 |
RR | 繰り返し可能な読み込み |
RS | 読み込みの安定 |
RS KEEP UPDATE LOCKS | FOR UPDATE OF 節を指定している場合にのみ有効です。
読み込みの安定と更新ロックの保持です。 |
RR KEEP UPDATE LOCKS | FOR UPDATE OF 節を指定している場合にのみ有効です。
繰り返し可能な読み込みと更新ロックの保持です。 |
UR | 未コミットの読み込み |
WITH UR
は、テーブルが読み取り専用のときに SELECT
ステートメント内にのみ指定できます。 デフォルトの分離レベルは、ステートメントがバインドされるパッケージまたはプランの分離によって決定されます。 また、デフォルトの分離レベルは、結果テーブルが読み取り専用かどうかによっても変わります。 デフォルトの分離レベルについては、IBM
文献を参照してください。
注意:
また、このオプションは非カーソル選択にのみ有効です。
[ QUERYNO integer] |
QUERYNO
節では、この SQL ステートメントの EXPLAIN
出力とトレースレコードで使用される番号を指定します。 番号は、このステートメントの情報を含む行の PLAN_TABLET
の QUERYNO
列として使用されます。
FETCH FIRST |
1 integer |
ROWS ROW |
ONLY |
FETCH FIRST
節では、フェッチする行の数を制限します。 ごく限られた数の行が必要な場合にこの節を使用すると、結果セットの規模が大きくなる可能性のあるクエリのパフォーマンスが向上します。
[WITH HOLD ]
|
WITH HOLD
節は、データベースループ内のコミット処理によってカーソルがクローズされないようにするために使用します。 WITH HOLD
を指定した場合、コミット処理により現在の作業論理ユニットの更新はすべてコミットされますが、この際、カーソルを維持する必要のないロックしか解放されません。 この節は、主にバッチモードで役立ちます。CICS 擬似会話型モードおよび IMS メッセージドリブンプログラムでは無視されます。
例:
SELECT name INTO #name FROM table WHERE AGE = 2 WITH HOLD
[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 では部分的な結果セットを取得しています。
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
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 |
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
カーソルは、一度オープンされると、その後に基本テーブルを対象に実行される UPDATE
、DELETE
、または INSERT
を反映しません。
SENSITIVE STATIC SCROLL
は、位置決め UPDATE
または位置決め DELETE
処理に使用できるカーソルを表します。 また、SENSITIVE STATIC SCROLL
カーソルは、基本テーブルの行の UPDATE
、DELETE
を反映します。 ただし、INSERT
処理は反映しません。
SENSITIVE DYNAMIC
スクロール可能カーソルは、カーソルがオープンされている間、基本テーブルを対象に実行される UPDATE
、DELETE
、および INSERT
を反映します。
以下に参考情報を示します。
変数 scroll_hv は英数字にする必要があります。
変数 scroll_hv では、データベース処理ループの 1 回の実行でフェッチする結果テーブルの行を指定します。 また、FETCH
処理中に基本テーブルを対象に実行される UPDATE
または DELETE
に対する感度を指定します。 scroll_hv の内容は、データベース処理ループサイクルが実行されるたびに評価されます。
INSENSITIVE |
AFTER CURRENT |
|||||||||
ABSOLUTE |
[+ | - ] integer |
感度 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
では、対応する基本テーブルの列はチェックされません。
フェッチする行、フェッチの開始位置、およびスクロール方向を決定するためのオプションについて次に説明します。
オプション | 説明 |
---|---|
AFTER | 最後の行の後に位置決めします。 行はフェッチされません。 |
BEFORE | 最初の行の前に位置決めします。 行はフェッチされません。 |
CURRENT | 現在の行を(再度)フェッチします。 |
FIRST | 最初の行をフェッチします。 |
LAST | 最後の行をフェッチします。 |
NEXT | 現在の行の次の行をフェッチします。 これはデフォルト値です。 |
PRIOR | 現在の行の前の行をフェッチします。 |
+/- integer |
フェッチする行の位置を 整数の前にプラス記号(+)またはマイナス記号(-)を入力します。 デフォルト値はプラス(+)です。 |
ABSOLUTE |
+/- integer との接続でのみ適用されます。 行をフェッチする結果セット内の絶対位置として integer を使用します。 正または負の位置番号の詳細については、IBM 提供の DB2 SQL リファレンスを参照してください。 |
RELATIVE |
+/- integer との接続でのみ適用されます。 行をフェッチする結果セット内の現在の位置への相対位置として integer を使用します。 正または負の位置番号の詳細については、IBM 提供の DB2 SQL リファレンスを参照してください。 |
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 も参照してください。