このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連機能グループ:データベースへのアクセスと更新
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 BY criteria] |
|||||||||||
statement | |||||||||||
[WITH_CTE common-table-expression, ] |
||||||||||||
SELECT selection into-clause table-expression |
||||||||||||
|
|
|||||||||||
[ORDER BY criteria] |
||||||||||||
[OPTIMIZE
FOR integer ROWS] |
||||||||||||
[WITH isolation-level] |
||||||||||||
[QUERYNO integer] |
||||||||||||
[FETCH
FIRST row-limit] |
||||||||||||
[WITH
HOLD] |
||||||||||||
[WITH
RETURN] |
||||||||||||
[WITH scroll-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 | |||||||
[ WITH isolation-level] |
|||||||
[ FETCH FIRST row-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 FOR integer 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 ...
QUERYNO integer |
「選択式」の「選択」を参照してください。.
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 説明 0
FETCH
処理が正常に完了し、データが返されました(ただし、オプション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 ...