このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連機能グループ:データベースへのアクセスと更新
SELECT ステートメントでは、任意の行数を取得するためのカーソル選択と、多くても 1 つの行を取得する非カーソル選択(単独 SELECT)の両方がサポートされています。SELECT ... END-SELECT 構造では、Natural は FIND ステートメントの場合と同じデータベースループ処理を使用します。
2 つの異なる構造が可能です。
Natural FIND ステートメントと同様、カーソル指向の SELECT ステートメントは検索条件を基準に 1 つ以上の DB2 テーブルから行(レコード)のセットを選択するために使用します。データベースループが開始されるため、ループは LOOP(レポーティングモード)または END-SELECT ステートメントで閉じる必要があります。この構造では、Natural は FIND ステートメントの場合と同じ処理ループを使用します。
また、アプリケーションプログラムからのカーソル管理は必要なく、Natural によって自動的に処理されます。
SELECT selection into-clause table-expression |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|||||||||||
[ORDER BYcriteria] |
|||||||||||
| statement |
|||||||||||
|
|
|
||||||||||
[WITH_CTEcommon-table-expression, ] |
||||||||||||
SELECT selection into-clause table-expression |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
||||||||||||
[ORDER BYcriteria] |
||||||||||||
[OPTIMIZE
FOR integer ROWS] |
||||||||||||
[WITHisolation-level] |
||||||||||||
[QUERYNOinteger] |
||||||||||||
[FETCH
FIRST row-limit] |
||||||||||||
[WITH
HOLD] |
||||||||||||
[WITH
RETURN] |
||||||||||||
[WITHscroll-mode] |
||||||||||||
[WITH ROWSET
POSITIONING FOR max-rowsets] |
||||||||||||
[IF NO RECORDS
FOUND instruction] |
||||||||||||
| statement |
||||||||||||
|
|
|
|||||||||||
SELECT SINGLE ステートメントでは、非カーソル選択(単独 SELECT)の機能、つまり、カーソルを使用せずに多くても 1 つの行を取得する選択式がサポートされています。これは位置決め UPDATE や位置決め DELETE ステートメントでは参照できません。
SELECT
SINGLE |
|||||||
| selection into-clause table-expression | |||||||
[IF NO RECORDS
FOUND instruction] |
|||||||
| statement |
|||||||
|
|
|
||||||
SELECT SINGLE |
|||||||
| selection into-clause table-expression | |||||||
[WITHisolation-level] |
|||||||
[FETCH FIRSTrow-limit] |
|||||||
[IF NO RECORDS
FOUND instruction] |
|||||||
| statement |
|||||||
|
|
|
||||||
このセクションでは、構文 1 - カーソル選択と構文 2 - 非カーソル選択の構文図に含まれる構文項目をアルファベット順に説明します。
ストラクチャードモードの場合、Natural の予約キーワード END-SELECT を使用して SELECT ステートメントを終了させる必要があります。
レポーティングモードでは、LOOP ステートメントを使用して SELECT ステートメントを終了します。
FETCH FIRST |
|
|
|
|
|
|
ONLY |
||
FETCH FIRST 節では、フェッチする行の数を制限します。ごく限られた数の行が必要な場合にこの節を使用すると、結果セットの規模が大きくなる可能性のあるクエリのパフォーマンスが向上します。
この節は DB2 データベースにのみ有効です。他のデータベースに使用すると、ランタイムエラーが発生します。
注意:
この節は実際には 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 節を使用せずに、対応する空値インジケータフィールドの値をチェックする必要があります。
INTO |
|
parameter, |
|
INTO キーワードによって INTO 節が導入されます。この節は、選択の結果を格納するプログラム内のターゲットフィールドを指定するために使用します。
INTO 節では、DEFINE DATA ステートメントで定義された単一の parameters または 1 つ以上のビューを指定できます。
全ターゲットフィールドは単一テーブルまたはジョイン処理でできた複数のテーブルから値を受け取ることができます(「ジョインクエリ」も参照)。
注意:
標準 SQL 構文では、INTO 節は非カーソル選択処理(単独 SELECT)でのみ使用されるため、単一行を選択する場合にのみ指定できます。ただし、Natural では、カーソル選択処理および非カーソル選択処理のどちらにも INTO 節を使用します。
selection はアスタリスク(*)のみでも構成できます。標準選択式では、FROM 節に指定されたテーブル(複数可)の全列名のリストに対する省略形です。ただし、同じ構文項目 SELECT * は、Natural SELECT ステートメントでは異なる意味になります。INTO 節にリストされた項目はすべて選択にも使用されます。それらの名前は既存のデータベースの列名に対応させる必要があります。
構文要素の説明:
| 構文要素 | 説明 |
|---|---|
parameter |
個々のパラメータをターゲットフィールドとして指定する場合、パラメータの数とフォーマットは、対応する選択(上記)に指定された columns または scalar-expressions(あるいは両方)の数とフォーマットに一致する必要があります(詳細については、「スカラ式」を参照)。「例 5」を参照してください。
|
view-name |
DEFINE DATA ステートメントでの定義に従った Natural ビューの名前。
注意: |
correlation-name |
複数のテーブルが連結(ジョイン)される |
- 例
例 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 PERSDEFINE 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の内容を受け取ります。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 ...
OPTIMIZE FORinteger ROWS |
この節は DB2 データベースにのみ有効です。他のデータベースに使用すると、ランタイムエラーが発生します。
OPTIMIZE FOR integer ROWS 節は、結果テーブルから取得する行の数(integer)を前もって DB2 に知らせるために使用します。この節を使用しない場合、DB2 では結果テーブルのすべての行が取得されると仮定し、それに応じて最適化を行います。
このオプションの節は、選択される行の数を把握している場合に役立ちます。実際に選択される行数が integer 値(0~2147483647)を超えない場合、integer の行を最適化することでパフォーマンスが向上します。
- 例
SELECT name INTO #name FROM table WHERE AGE = 2 OPTIMIZE FOR 100 ROWS
ORDER
BY |
|
|
column-reference |
|
|
ASC |
|
|
|
| integer | DESC |
ORDER BY 節は、SELECT ステートメントの結果を特定の順序で整列します。
構文要素の説明:
| 構文要素 | 説明 |
|---|---|
column-reference |
各 ORDER BY 節には、結果テーブルの列を指定する必要があります。ほとんどの ORDER BY 節で、column-reference(オプションで修飾された列名)、または列番号によって列を識別できます。UNION を指定したクエリでは、列は列番号で識別する必要があります。「列参照」も参照してください。
|
integer |
UNION を指定したクエリでは、列は列番号で識別する必要があります。列番号は、選択内で左から右へ位置づけ、整数値で示します。この機能により、名前を持たない計算列に基づいて結果を整列できるようになります。
|
ASC|DESC |
ソート順を昇順(ASC)または降順(DESC)に指定します。ASC はデフォルトです。「例 2」を参照してください。
|
- 例
例 1
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 ...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 ...
QUERYNOinteger |
「選択式」の「選択」を参照してください。.
SKIP LOCKED DATA 節を指定すると、不適合のロックが他のトランザクションによって行に保持されている場合に、行をスキップします。
処理ループで実行される Natural ステートメント。
「選択式」の table-expression を参照してください
UNION はセット操作を含むクエリを導入します。
INTO 節は、最初の select-expression にのみ指定する必要があります。
構文要素の説明:
| 構文要素 | 説明 |
|---|---|
UNION |
|
ALL |
指定すると、結果セットに余分な(重複した)行を含みます。
|
- 例
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 ...
WITH_CTE common-table-expression-name [(column-name,…)] AS (fullselect) |
この節では、後に続く SELECT ステートメントの任意の FROM 節で参照できる結果テーブルを定義できます。
構文要素の説明:
common-table-expression を使用できます
ビューの作成を回避するため、ビューの代わりとして使用する場合
全選択内で同じ結果テーブルを共有する必要がある場合
反復を使用して結果を導出する必要がある場合
反復を使用するクエリは、材料の請求書などの用途に便利です。
- 例
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
この節は現在はサポートされていません。使用すると、コンパイラエラーが発生します。
WITH |
|
|
この節では、ステートメントを実行するときの分離レベルを明示的に指定できます。
この節は DB2 データベースにのみ有効です。他のデータベースに使用すると、ランタイムエラーが発生します。
次のオプションを使用できます。
| オプション | 意味 |
|---|---|
CS |
カーソルの安定 |
RR |
繰り返し可能な読み込み |
RR KEEP UPDATE
LOCKS |
構文 1 - 拡張セットに対してのみ、および位置決め UPDATE または位置決め DELETE ステートメントが SELECT ステートメントで処理される場合にのみ、適用されます。
繰り返し可能な読み込みと更新ロックの保持です。 |
RS |
読み込みの安定 |
RS KEEP UPDATE
LOCKS |
構文 1 - 拡張セットに対してのみ、および位置決め UPDATE または位置決め DELETE ステートメントが SELECT ステートメントで処理される場合にのみ、適用されます。
読み込みの安定と更新ロックの保持です。 |
UR |
未コミットの読み込み
|
この節は現在はサポートされていません。使用すると、コンパイラエラーが発生します。
WITH |
|
|
|
[:] scroll_hv[GIVING
[:] sqlcode]
|
|||
Natural では、WITH ASENSITIVE SCROLL、WITH SENSITIVE
STATIC SCROLL および SENSITIVE DYNAMIC SCROLL を使用して、SQL のスクロール可能カーソルをサポートします。スクロール可能カーソルにより、Natural アプリケーションで結果セット内の任意の行をランダムに位置決めできるようになります。スクロール不可能なカーソルでは、データは上から下に順番に読み込むことしかできません。
この節では、RDBMS のスクロール可能カーソルを有効にします。スクロール可能カーソルは、ASENSITIVE、INSENSITIVE、SENSITIVE
STATIC または SENSITIVE DYNAMIC です。
スクロール可能カーソルにより、カーソルがオープンされている限り、アプリケーションでカーソル位置の任意の行をいつでも位置決めできるようになります。スクロール可能カーソルは、Sybase データベースではサポートされていません。スクロール可能カーソルは、MS SQL Server DBLIB インターフェイスではサポートされていませんが、MS SQL Server ODBC インターフェイスに限ってサポートされています。
位置決めは scroll_hv の内容に基づいて行われます。内容は、DB2 に対する FETCH が実行されるたびに評価されます。
注意:
すべての SQL データベースシステムですべてのオプションがサポートされているわけではありません。
構文要素の説明:
| 構文要素 | 説明 |
|---|---|
ASENSITIVE
SCROLL |
カーソルが INSENSITIVE または SENSITIVE DYNAMIC のいずれかであることを指定します。
これは、カーソルの読み取り専用プロパティに基づいて、カーソルのオープン時のデータベースによって決定されます。カーソルが読み取り専用の場合、カーソルは |
INSENSITIVE
SCROLL |
指定すると、カーソルが更新された後、基本テーブルに対する更新、削除、および挿入でカーソルが無効になります。INSENSITIVE SCROLL は、位置決め UPDATE または位置決め DELETE 操作では使用できないカーソルを示します。これは、Oracle、Adabas D、Informix、MS SQL Server ODBC、および DB2 データベース用にサポートされています。また、INSENSITIVE
SCROLL カーソルは、一度オープンされると、その後に基本テーブルを対象に実行される UPDATE、DELETE または INSERT 操作を反映しません。
注も参照してください。 |
SENSITIVE STATIC
SCROLL |
指定すると、カーソルがオープンした後、基本テーブルに対する更新および削除でカーソルが有効になりますが、挿入ではカーソルは有効になりません。SENSITIVE STATIC SCROLL は、位置決め UPDATE または位置決め DELETE 操作で使用できるカーソルを示します。これは、Adabas D、MS SQL Server ODBC、および DB2 データベースでサポートされています。さらに、SENSITIVE STATIC SCROLL カーソルは基本テーブル行の UPDATE および DELETE 操作を反映します。ただし、INSERT 処理は反映しません。
注も参照してください。 |
SENSITIVE DYNAMIC
SCROLL |
SENSITIVE DYNAMIC では、カーソルのオープン後、基本テーブルを対象に実行される更新、削除、および挿入に対してカーソルをセンシティブにすることを指定します。
|
注意:INSENSITIVE および SENSITIVE STATIC スクロール可能カーソルでは一時的な結果テーブルを使用し、DB2 に TEMP データベースが必要になります(IBM の関連 DB2 文献を参照)。
- scroll_hv
変数
scroll_hvは英数字にする必要があります。変数
scroll_hvでは、データベース処理ループの 1 回の実行でフェッチする結果テーブルの行を指定します。scroll_hvの内容は、データベース処理ループサイクルが実行されるたびに評価されます。
INSENSITIVE
SENSITVE
CURRENT
FIRST
LAST
PRIOR
NEXT
ABSOLUTE
RELATIVE
+
-
integer - scroll_hv オプション
オプション 説明 CURRENT現在の行を(再度)フェッチします。 FIRST最初の行をフェッチします。 LAST最後の行をフェッチします。 NEXT現在の行の次の行をフェッチします。これはデフォルト値です。 PRIOR現在の行の前の行をフェッチします。 +|-integer
ABSOLUTEまたはRELATIVEの接続でのみ適用されます。フェッチする行の位置を
ABSOLUTEまたはRELATIVEで指定します。整数の前にプラス記号(+)またはマイナス記号(-)を入力します。
デフォルト値はプラス(+)です。
ABSOLUTE
+|-integerとの接続でのみ適用されます。行をフェッチする結果セット内の絶対位置として
integerを使用します。RELATIVE
+|-integerとの接続でのみ適用されます。行をフェッチする結果セット内の現在の位置への相対位置として
integerを使用します。特別な RDBMS システムにはいくつかの制限があります。
DB2 ではキーワード
CURRENTはサポートされていません。
SELECT FOR UPDATEループにおいては、DB2 ではスクロールオプションとしてNEXTのみがサポートされています。MS SQL Server(ODBC インターフェイス)ではキーワード
CURRENTはサポートされていません。Adabas D では
RELATIVEスクロールはサポートされていません。- GIVING [:] sqlcode
GIVING [:] sqlcodeの指定は任意です。指定する場合、Natural 変数[:] sqlcodeのフォーマットは I4 にする必要があります。この変数の値は、基準となるFETCH処理の DB2SQLCODEから返されます。これにより、スクロール可能カーソルがオープンされている間に発生した各種ステータスにアプリケーションで対応できるようになります。SQLCODEで示される最も重要なステータスコードを次の表に示します。
SQLCODE 説明 0FETCH処理が正常に完了し、データが返されました(ただし、オプションBEFOREまたはAFTERを指定したFETCHを除く)。+100行は見つかりません。カーソルはオープンされたままです。データは返されませんでした。 -1行に対する FETCH試行中の一般的なエラーです。
GIVING [:] sqlcodeを指定する場合、アプリケーションで各種ステータスに対応できる必要があります。端末 I/O なしで 5 回連続してSQLCODE +100になった場合、アプリケーションループを回避するために、Natural for DB2 ランタイムから Natural エラー NAT3296 が発行されます。アプリケーションでは、ESCAPEステートメントを実行して処理ループを終了できます。
GIVING [:] sqlcodeを指定しない場合、SQLCODE 0およびSQLCODE +100を除き、各SQLCODEによって Natural エラー NAT3700 が生成され、処理ループが終了します。SQLCODE +100(行は見つかりません)では処理ループが終了します。Natural システムライブラリ
SYSDB2で提供されているプログラム例DEM2SCRLも参照してください。
WITH ROWSET POSITIONING
FOR |
|
|
|
ROWS |
|
ROWS_RETURNED [:]ret_row |
|
この節は、Natural ネイティブ DML マルチフェッチ処理に対応する DB2 行セット処理を有効にします。[:] row_hv
(I4) または integer は、DB2 から Natural に返される行の最大数を決定します。この数値は、標準の複数行処理に使用される Natural マルチフェッチバッファのサイズ、または高度な複数行処理のために DB2 から Natural プログラムに返される最大行の数のいずれかを決定します。
- ROWS_RETURNED [:]ret_row 節:
この節は、高度な複数行処理を行うために、最後に実行された DB2 フェッチ操作のために DB2 によって返される行数を取得し、I4 変数を指定します。
ジョインとは複数のテーブルからデータを取得するクエリです。関連するテーブルはすべて FROM 節に指定する必要があります。
ジョインは常に FROM 節にリストされたテーブルのデカルト積を形成し、このデカルト積から WHERE 節に指定されたジョイン条件を満たさない行をすべて削除します。
テーブル名が長すぎる場合、相関名を使用して書き込みを保存できます。選択リストに指定された列が、連結(ジョイン)される複数のテーブルに存在するとき、同じ名前のどの列を選択するかを識別するために相関名を使用する必要があります。
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
...