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

基本構文項目

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

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


定数

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

これらの各項目については、以下で説明します。

constant 項目 constant は、常に Natural 定数を表します。
integer 項目 integer は、常に整数の定数を表します。

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

無効な構文: 有効な構文:
VALUES (1,'A')    leads to a syntax error 
VALUES (1,2,3)    leads to wrong results
VALUES (1 ,'A') 
VALUES (1 ,2 ,3)

Top of page

名前

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

これらの各項目については、以下で説明します。

authorization-identifier 項目 authorization-identifier(作成者名とも呼ばれる)は、データベーステーブルとビューを修飾するために使用します。 下記も参照してください。
ddm-name 項目 ddm-name は、常に Natural ユーティリティ SYSDDM で作成された Natural DDM の名前を表します。
view-name 項目 view-name は、常に DEFINE DATA ステートメントで定義された Natural ビューの名前を表します。
column-name 項目 column-name は、常に物理データベース列の名前を表します。
table-name

構文:

authorization-identifierddm-name

このセクションの項目 table-name は、SQL 基本テーブルと SQL ビューテーブルの両方を参照するために使用します。 Natural DDM は、使用するテーブル用に作成されている必要があります。 このような DDM の名前は、対応するデータベーステーブル名またはビュー名と同じにする必要があります。

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 データベースシステムによって決定されます。

table-names は、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 は、テーブル名のエイリアス名を表します。 列名を修飾するために使用できます。また、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 を使用する必要はありませんが、使用するとステートメントがわかりやすくなります。

Top of page

パラメータ

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 標準に準拠するために、ホスト変数の先頭にコロン(:)を付けることもできます。 フレキシブル SQL で使用する場合、ホスト変数はコロンで修飾する必要があります。

例:

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

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

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 は送信側ホスト変数を表し、: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 列にこの固定長フィールドに収まりきらない文字が含まれている場合、長さインジケータフィールドは実際に返された長さに設定され、空値インジケータフィールド(指定されている場合)はこの列の合計長に設定されます(取得)。 これは 32KB 以上の固定長フィールドには適用されません(長さが空値インジケータフィールドに収まらないため)。

Top of page

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 フォーマットに対する次の拡張を使用できます。

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

Top of page