基本構文項目

このドキュメントでは、個々の SQL ステートメントの説明で参照されている基本構文項目について説明します。

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


定数

Natural SQL ステートメントの構文記述で使用される定数は次のとおりです。

constant 項目 constant は、Natural 定数または SQL datetime constant のいずれかを参照します。
integer 項目 integer は、常に整数の定数を表します。

注意:
小数点表記の文字(セッションパラメータ DC)がコンマ(,)に設定されている場合、指定した数値定数の直後にコンマを続けてはならず、定数とコンマを空白文字で区切る必要があります。そうしないと、エラーまたは不正な結果が生じます。

無効な構文: 有効な構文:

VALUES (1,'A') は構文エラーにつながります。

VALUES (1,2,3) は誤った結果につながります。

VALUES (1 ,'A')

VALUES (1 ,2 ,3)

SQL 日時定数

SQL 日時定数は、次のいずれかを指定する特定のフォーマットの文字列定数です。

DATE string-constant SQL 日付定数を指定します。例:DATE '2013-15-01'
TIME string-constant SQL 時間定数を指定します。例:TIME '10:30:15'
TIMESTAMP string-constant SQL タイムスタンプ定数を指定します。例:TIMESTAMP '2014-15-01 10:20:15.123456'

有効な string-constant フォーマットについては、IBM の『DB2 SQL 参照情報』を参照してください。

名前

Natural SQL ステートメントの構文記述で使用される名前は次のとおりです。

authorization-identifier

項目 authorization-identifier(作成者名とも呼ばれる)は、データベーステーブルとビューを修飾するために使用します。下記の table-name 下の authorization-identifier も参照してください。

ddm-name

項目 ddm-name は、Natural DDM サービスで作成された、Natural データ定義モジュール(DDM)の名前を常に参照します。

view-name

項目 view-name は、常に DEFINE DATA ステートメントで定義された Natural ビューの名前を表します。

column-name

項目 column-name は、常に物理データベース列の名前を表します。

location-name

項目 location-name は常にテーブルの位置を示します。ロケーション名の指定はオプションで、SQL 拡張セットに属します。

table-name

このセクションの項目 table-name は、SQL 基本テーブルと SQL ビューテーブルの両方を参照するために使用します。

table-name の構文項目:

[[location-name.]authorization-identifier.]ddm-name

構文要素の説明:

構文要素 説明
ddm-name Natural データ定義モジュール(DDM)は、使用するテーブル用に作成されている必要があります。このような DDM の名前は、対応するデータベーステーブル名またはビュー名と同じにする必要があります。
location-name このオプション項目は、アクセスするテーブルの場所を指定します。
authorization-identifier データベーステーブルまたはビューの authorization-identifier は、2 とおりの方法で指定できます。

1 つの方法は標準 SQL 構文に対応しています。この場合、authorization-identifier とテーブル名はピリオドで区切ります。この形式を使用する場合、authorization-identifier を使用せずに、DDM の名前をデータベーステーブルの名前と同じにする必要があります。

例:

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

別の方法として、authorization-identifier を DDM 名の一部として定義できます。DDM 名は、authorization-identifier とデータベーステーブル名をハイフン(-)で区切った構成です。authorization-identifier とテーブル名の間のハイフンは内部的にピリオドに変換されます。

注意:
この形式の DDM 名は、FIND または READ ステートメントでも使用できます。これらのステートメントに適用される DDM 命名規則に準拠しているためです。

例:

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

authorization-identifier が明示的にも DDM 名内にも指定されていない場合、SQL データベースシステムによって決定されます。

テーブル名は、SELECT ステートメントで使用されるほか、DELETEINSERT、および UPDATE ステートメントにも指定できます。

例:

... 
DELETE FROM SQL.PERSONNEL 
  WHERE AGE IS NULL 
 ... 
    
... 
INSERT INTO SQL.PERSONNEL (NAME,AGE) 
  VALUES ('ADKINSON',35) 
... 
    
... 
UPDATE SQL.PERSONNEL 
SET SALARY = SALARY * 1.1 
WHERE AGE > 30 
...

correlation-name

項目 correlation-name は、table-name のエイリアス名を表します。列名を修飾するために使用できます。また、SELECT ステートメントの INTO 節で使用すると、Natural ビューでフィールドを暗黙的に修飾できます。

例:

DEFINE DATA LOCAL 
01 PERS-NAME    (A20) 
01 EMPL-NAME    (A20) 
01 AGE          (I2) 
END-DEFINE 
... 
SELECT X.NAME , Y.NAME , X.AGE 
  INTO PERS-NAME , EMPL-NAME , AGE 
  FROM SQL-PERSONNEL X , SQL-EMPLOYEES Y 
  WHERE X.AGE = Y.AGE 
END-SELECT 
...

ほとんどの場合、correlation-names を使用する必要はありませんが、使用するとステートメントがわかりやすくなります。

パラメータ

parameter の構文項目:

[:] host-variable [INDICATOR [:]host-variable] [LINDICATOR [:] host-variable]

構文要素の説明:

構文要素 説明
host-variable host-variable は、SQL ステートメントで参照される Natural ユーザー定義変数(システム変数ではない)です。個々のフィールドまたは Natural ビューの一部として定義できます。

受信側フィールドとして(INTO 節などで)定義する場合、host-variable では値がデータベースシステムによって割り当てられている変数を識別します。

送信側フィールドとして(WHERE 節などで)定義する場合、host-variable ではプログラムからデータベースシステムに渡される値を指定します。

Natural フォーマットと SQL データタイプ」も参照してください。

[:]
コロン:

SQL 標準に準拠するために、host-variable の先頭にコロン(:)を付けることもできます。フレキシブル SQL で使用する場合、host-variables はコロンで修飾する必要があります。

例:

SELECT NAME INTO :#NAME FROM PERSONNEL 
WHERE AGE = :VALUE

変数名が SQL 予約語と同一の場合、コロンは常に必要です。host-variable または列の参照が可能な状況では、コロンなしの名前を使用すると、列への参照として解釈されます。

INDICATOR
INDICATOR 節:

INDICATOR 節は、"空値"(つまり、値なし)と実際の値 0 または "空白" を区別するためのオプション機能です。

受信側 host-variable(ターゲットフィールド)で指定する場合、INDICATOR host-variable(空値インジケータフィールド)によって、取得される列が "空値" であるかどうかを調べることができます。

例:

DEFINE DATA LOCAL 
1 NAME      (A20) 
1 NAMEIND   (I2) 
END-DEFINE 
SELECT * 
  INTO NAME INDICATOR NAMEIND 
...

この例では、NAME は受信側 host-variable を表し、NAMEIND は空値インジケータフィールドを表します。

空値インジケータフィールドが指定されており、取得される列が空値の場合、空値インジケータフィールドの値は負になり、そのデータタイプに応じてターゲットフィールドが 0 または "空値" に設定されます。それ以外の場合、空値インジケータフィールドの値は 0 以上になります。

送信側 host-variable(ソースフィールド)で指定する場合、空値インジケータフィールドはこのフィールドに空値を指定するために使用されます。

例:

DEFINE DATA LOCAL 
1 NAME      (A20) 
1 NAMEIND   (I2) 
UPDATE ... 
SET NAME = :NAME INDICATOR :NAMEIND 
WHERE ...

この例では、:NAME は送信側 host-variable を表し、:NAMEIND は空値インジケータフィールドを表します。空値インジケータフィールドの入力として負の値を入力すると、空値がデータベース列に割り当てられます。

INDICATOR host-variable のフォーマット/長さは I2 です。

LINDICATOR
LINDICATOR 節:

LINDICATOR 節は、可変長(例えば、VARCHAR または LONG VARCHAR タイプ)の列をサポートするためのオプション機能です。

受信側 host-variable(ターゲットフィールド)で指定する場合、LINDICATOR host-variable(長さインジケータフィールド)にはデータベースによってターゲットフィールドに実際に返された文字数が入ります。ターゲットフィールドは常に空白で埋められます。

VARCHAR または LONG VARCHAR 列にターゲットフィールドに収まりきらない文字が含まれている場合、長さインジケータフィールドは実際に返された長さ(つまり、ターゲットフィールドの長さ)に設定され、空値インジケータフィールド(指定されている場合)はこの列の合計長に設定されます。

DEFINE DATA LOCAL 
1 ADDRESSLIND (I2) 
1 ADDRESS     (A50/1:6) 
END-DEFINE 
SELECT * 
  INTO :ADDRESS(*) LINDICATOR :ADDRESSLIND 
  ...

この例では、:ADDRESS(*) はアドレス指定された VARCHAR または LONG VARCHAR 列の最初の 300 バイト(利用可能な場合)を受け取るターゲットフィールドを表し、:ADDRESSLIND は実際に返された文字数を含む長さインジケータフィールドを表します。

送信側 host-variable(ソースフィールド)で指定する場合、長さインジケータフィールドではデータベースに渡されるソースフィールドの文字数を指定します。

例:

DEFINE DATA LOCAL 
1 NAMELIND  (I2) 
1 NAME      (A20) 
1 AGE       (I2) 
END-DEFINE 
MOVE  4     TO NAMELIND 
MOVE 'ABC%' TO NAME 
SELECT AGE 
  INTO :AGE 
WHERE NAME LIKE :NAME LINDICATOR :NAMELIND 
  ...

LINDICATOR host-variable のフォーマット/長さは I2 または I4 です。パフォーマンス上の理由から、対応するターゲットフィールドまたはソースフィールドの直前に指定する必要があります。そうしないと、フィールドはランタイムに一時ストレージにコピーされます。

LINDICATOR フィールドを I2 フィールドとして定義すると、対応する列の送受信には SQL データタイプ VARCHAR が使用されます。LINDICATOR host-variable を I4 として指定すると、ラージオブジェクトデータタイプ(CLOB/BLOB)が使用されます。

フィールドを DYNAMIC として定義すると、列は内部ループでは実際の長さまで読み取られます。LINDICATOR フィールドと *LENGTH はこの長さに設定されます。固定長フィールドの場合、列は定義された長さまで読み込まれます。いずれの場合も、フィールドは LINDICATOR フィールドで定義した値まで書き込まれます。

固定長フィールドの定義には、I2 として指定した LINDICATOR フィールドを使用してください。VARCHAR 列にこの固定長フィールドに収まりきらない文字が含まれている場合、長さインジケータフィールドは実際に返された長さに設定され、空値インジケータフィールド(指定されている場合)はこの列の合計長に設定されます(取得)。これは 32 KB 以上の固定長フィールドには適用されません(長さが空値インジケータフィールドに収まらないため)。

Natural フォーマットと SQL データタイプ

ホスト変数の Natural データフォーマットは、次の表に従って SQL データタイプに変換されます。

Natural フォーマット/長さ SQL データタイプ
An CHAR (n)
B2 SMALLINT
B4 INT
Bnn は 2 または 4 以外) CHAR (n)
F4 REAL
F8 DOUBLE PRECISION
I2 SMALLINT
I4 INT
Nnn.m NUMERIC (nn+m,m)
Pnn.m NUMERIC (nn+m,m)
T TIME
D DATE
Gn(ビューフィールドのみ) GRAPHIC (n)

Natural では、変換後の SQL データタイプがデータベース列と互換性があるかどうかはチェックされません。フォーマット N のフィールドを除き、データ変換は行われません。

また、Natural SQL では、標準 Natural フォーマットに対する次の拡張を使用できます。

  • フォーマット A の 1 次元配列を使用して、253 バイトを超える英数字列をサポートできます。この配列はインデックス 1 から定義する必要があり、インデックスとしてアスタリスク(*)を使用することでのみ参照できます。対応する SQL データタイプは CHAR (n) です。ここで、n は配列の合計バイト数です。

  • キーワード LINDICATOR で指定した特別な host-variable を使用して、可変長列をサポートできます。対応する SQL データタイプは VARCHAR (n) です。LINDICATOR 節も参照してください。

  • Entire Access では、Natural フォーマットの日付(D)および時刻(T)を使用できます。これらのフォーマットは、対応するデータベース依存フォーマットに変換されます(詳細については、Entire Access ドキュメントを参照)。

LINDICATOR フィールドを使用せずに 1 次元配列として指定した送信側フィールドは、SQL データタイプ VARCHAR に変換されます。長さは配列の合計バイト数になり、末尾の空白は考慮されません。