# CHAPTER 4: コマンドリファレンス

このセクションでは、C 言語 Empress SQLプリコンパイラのコマンドステートメントの 構文をアルファベット順に示します。 各SQLコマンド行は、キーワード`EXEC SQL`で開始し、 セミコロン (;)で終了しなければなりません。 また、SQL ステートメントは複数行に渡って指定することができます。

- BEGIN DECLARE SECTION
- CALL
- CANCEL TRANSACTION
- CLOSE CURSOR
- CLOSE_TABLE
- COMMIT TRANSACTION
- DATABASE IS
- DECLARE CURSOR
- DELETE
- END DECLARE SECTION
- EXIT
- FETCH
- FETCH_AGAIN
- INCLUDE SQLCA
- INIT
- INSERT
- OPEN CURSOR
- OPEN_TABLE
- SELECT INTO
- START TRANSACTION
- UPDATE
- WHERE
- WHENEVER

## BEGIN DECLARE SECTION

宣言セクションの始まりを指示します。 この宣言セクションにプログラムのSQL コマンドで使用する変数を宣言します。

構文 | `EXEC SQL BEGIN DECLARE SECTION;`
SQLCODE | 意味はありません。
注意 | ホスト言語の変数宣言の規則に従えば、宣言セクションはどの位置に記述しても構いません。 1つのプログラムで複数の宣言セクションを記述が可能ですが、 複数の宣言セクションを記述する場合は、宣言セクションをとおして 変数名は一意である必要があります。 宣言セクションは、SQL プリコンパイラステートメントを含むファイル内で グローバル(global)として宣言することを推奨します。 各`BEGIN DECLARE SECTION`には、対応する`END DECLARE SECTION`がなければ なりません。
例 |
    EXEC SQL BEGIN DECLARE SECTION;
       int i;
       short j;
       float f;
       char str [10];
    EXEC SQL END DECLARE SECTION;

## CALL

C プロシージャの呼び出し、または式の評価を行います。

構文 |
`EXEC SQL CALL` | `|expr |procedure_name [([expr {, expr}])]` | `|; |`
    EXEC SQL :var = [CALL] expr;
SQLCODE |
`0` | OK.
`-11` | Failed.
注意 | 各種集計関数とオペレーターはこのステートメント使って呼び出すことはできません。

## CANCEL TRANSACTION

現在、実行されているトランザクションを取り消します。

Syntax | `EXEC SQL CANCEL TRANSACTION;`
SQLCODE | 意味はありません。
注意 | `CANCEL TRANSACTION` は、すべてのデータベース上にわたる すべてのトランザクションをロールバックします。 検索ループ内で用いられた場合、 カレントレコードは有効ではありません。 ただし、`FETCH`ステートメントは、 適切な次のレコードを返します。

## CLOSE CURSOR

`CLOSE CURSOR`句は、行操作のためにオープンした カーソルをクローズします。

構文 | `EXEC SQL CLOSE cursor_name;` where:
`cursor_name` | オープン時にカーソルに割り当てられる名前です。
SQLCODE |
`0` | 正常です。
`-4` | カーソルは無効です。
注意 | カーソルはクローズしなければ、再オープンすることはできません。

## CLOSE_TABLE

指定したテーブルをクローズします。

構文 |
    EXEC SQL CLOSE_TABLE [table {, table}];
SQLCODE | 意味はありません。
注意 | `CLOSE_TABLE`コマンドにテーブル名を指定しないと、 すべてのテーブルがクローズされます。
例 1 | 次のコマンドは、すべてのオープンされたテーブルのクローズします。
       EXEC SQL CLOSE_TABLE;
例 2 | 次のコマンドは、指定した`loans` および`personnel`テーブルの クローズします。
       EXEC SQL CLOSE_TABLE loans, personnel;

## COMMIT TRANSACTION

`COMMIT TRANSACTION`は、現在のトランザクション中に データベースに対して行った変更をデータベースに反映します。

構文 |
    EXEC SQL COMMIT TRANSACTION;
SQLCODE | 意味はありません。
Note | `COMMIT TRANSACTION`はすべてのデータベースにわたる トランザクション全体をコミットします。

## DATABASE IS

カレントのデータベースを変更します。

構文 |
    EXEC SQL DATABASE IS database;
SQLCODE | 意味はありません。
注意 | データベース名は、フルパスで指定することができます。 この場合、引用符で囲む必要があります。 `DATABASE IS`は、PSM ルーチンおよびトリガでは使用することができません。

例 1

次のコマンドは、`repairs`ディレクトリに位置する `repairs`データベースをデフォルトデータベースに設定します。

       EXEC SQL DATABASE IS "repairs";

例 2

次のコマンドは、プログラム変数 "`:base`" に格納された名前のデータベースをデフォルトデータベースに設定します。

       EXEC SQL DATABASE IS :base;

## DECLARE CURSOR

オープンするカーソルを宣言します。 この処理ではカーソル名を定義し、 `WHERE`句によるコンテキストと名前を関連付けます。

構文 |
    EXEC SQL DECLARE cursor_name CURSOR
       FOR SELECT [ |DISTINCT |] [attr {, attr}]
                    |UNIQUE   |
       FROM table {, table}
       [where_clause]
       [sort_clause]
|  |  | `[FOR UPDATE [OF |* |attr {, attr}` | `|]]; |`
`sort_clause` |
`|SORT |ORDER` | `| BY attr[ |` | `|ASCENDING |DESCENDING` | `|] {, attr[ |` | `|ASCENDING |DESCENDING` | `|]} |`
SQLCODE | 意味はありません。
Notes | カーソルをオープンして使用するためには最初に宣言しなくてはなりません。 カーソルを宣言した後に使用する前にはオープンする必要があります。 1つのプログラムでは、カーソルは1度だけ宣言できます。 検索した行を読むだけでなく修正したい場合、 カーソルは`FOR UPDATE`または`FOR DEFERRED`で宣言しなくてはなりません。 検索した行のソートは`SORT`オプションを利用することで可能です。
例 |
       EXEC SQL DECLARE c1 CURSOR FOR
          SELECT FROM personnel, loans
          WHERE personnel.name='Jones'
             AND personnel.name = loans.name;
上記のコマンドは`c1`というカーソルを宣言します。 このカーソルは、テーブル`personnel` と `loans` から検索した行に対して処理を行います。 レコード検索の条件は、`WHERE`句に定義します。 このコンテキストは、`personnel`テーブルの `name`アトリビュートが`Jones`と等しく、 かつ、`personnel`テーブルの`name`アトリビュート と`loans`テーブル`name`アトリビュートが等しい レコードになります。

## DELETE

テーブルまたはビューから1行以上削除します。

構文 |
`EXEC SQL DELETE FROM table` | |`where_clause` |`WHERE CURRENT OF cursor_name` | |`;` |
SQLCODE |
`0` | 正常です。
`1` | 1行以上ロックされています。
`-1` | 誤った`WHERE`句が指定されています。 (`mxgetbegin() エラー`).
`-2` | 行を削除できませんでした。 (`mxdel() エラー`).
`-4` | 無効なカーソルです。
注意 | カーソルを`WHERE` 句に指定しない限り、`WHERE` 句を満たす行すべてが 削除されます。 カーソルを指定した場合は、カレント行だけが削除されます。 カレント行がない場合は、レコードは削除されず、 適切な`SQLCODE`が戻されます。 変数`SQLCNT` は、削除レコード数をチェックするために使用することができます。
例 1 | 次のコマンドはアトリビュート`amount`の値が 50 未満であるすべての レコードを`loans`テーブルから削除します。
       EXEC SQL DELETE FROM loans WHERE amount < 50;
例 2 | 次のコマンドは'`c`'という名前のカーソルと関連付けたコンテキストから カレントレコードを削除します。 カレントレコードがない場合、何も削除しません。
       EXEC SQL DELETE FROM loans WHERE CURRENT OF c;

## END DECLARE SECTION

プログラム中の SQL コマンドで使用する変数のための宣言セクションの終了を指示します。

構文 | `EXEC SQL END DECLARE SECTION;`
SQLCODE | 意味はありません。
注意 | 各`BEGIN DECLARE SECTION`には、対応する`END DECLARE SECTION`がなければ なりません。

## EXIT

クリーンアップ処理を実行します。ただし、プログラムは終了しません。

構文 | `EXEC SQL EXIT;`
SQLCODE | 意味はありません。
注意 | プログラムを終了する前は常に`EXIT`を実行する必要があります。 `EXIT`を実行した以降においては `INIT`を含む、 SQL 操作をおこなうことはできません。 `EXIT`は、PSMルーチンとトリガーの中では使用することはできません。

## FETCH

複数行の操作において、`FETCH`は定義したコンテキストの次の有効な行に カーソルを位置付けます。 この行をカレントにして、 指定されたアトリビュートの値を検索し、指示された変数にこの値を格納します。

構文 |
    EXEC SQL FETCH [|NEXT |[AGAIN][FROM]] cursor_name
                    |PRIOR|

         attr {, attr} INTO variable {, variable};
SQLCODE |
`0` | 正常です。
`1` | 行はロックされています。
`4` | 無効なカーソルです。
`100` | これ以上行は存在しません。
SQLWARN1 |
`''` | 切り詰め処理は実行されていません。
'`W`' | 切り詰め処理が実行されました。
注意 | コンテキストの次の行がアクセスできない場合(ロックされている場合)、 その行はカレント行とされますが、そのアトリビュート値はプログラム変数に 読み込まれません。`FETCH_AGAIN`コマンドを使用することで、 これらのアトリビュートの再読み込みを試みることができます
例 | 次のコマンドは、`c1`という名前のカーソルに関連付けられたコンテキストで 次に処理可能なレコードをカレントレコードとします。 アトリビュート`name` と `credit_limit`の値を取得し、 プログラム変数`:name` と`:crelim`にそれぞれの値を 格納します。
       EXEC SQL FETCH c1
          name, credit_limit
          INTO :name, :crelim;

## FETCH_AGAIN

`FETCH`が成功しなかった場合、 `FETCH_AGAIN`は、次の有効なレコードではなく カーソルが指示するカレントのレコードの再読み込みを試みます。

構文 |
    EXEC SQL FETCH_AGAIN cursor_name attr {, attr}
         INTO variable {, variable};
SQLCODE |
`0` | 正常です。
`1` | 行がロックされています。
`4` | 無効なカーソルです。
`100` | これ以上の行は存在しません。
SQLWARN1 |
`''` | 切り詰め処理は実行されていません。
'`W`' | 切り詰め処理は実行されました。
注意 | `FETCH_AGAIN`は、カレントレコードのステータスに影響しません。 `FETCH_AGAIN`の実行をしても、カーソルの移動はせず、 カレントレコードのままです。
例 | 次のコマンドは、 `c1`という名前のカーソルに関連付けられたコンテキストで カレントレコードからアトリビュート`name` と `credit_limit`の値を取得し、プログラム変数`:name` と`:crelim`にそれぞれの値を格納することを試みます。
       EXEC SQL FETCH_AGAIN c1
          name, credit_limit
          INTO :name, :crelim;

## INCLUDE SQLCA

SQLCA は、SQL コミュニケーションエリアで、 コンパイラとユーザーの共通のエリアとして使用されます。 `INCLUDE SQLCA`コマンドは、プログラム中の最初の プリコンパイラステートメントとして記述しなければなりません。

構文 | `EXEC SQL INCLUDE SQLCA`
SQLCODE | 意味はありません。
注意 | `INCLUDE SQLCA`ステートメントは、プログラムの最初の プリコンパイラステートメントとして記述しなければなりません。

## INIT

Empressの初期化処理を実行します。

構文 | `EXEC SQL INIT;`
SQLCODE |
`-1` | `INIT`は、既にコールされています。
注意 | `INIT`は、プログラム中で使用する 最初に実行可能なEmpress プリコンパイラコマンドで なければなりません。 `INIT`は、プログラム実行中に何回か呼び出される可能性がありますが 後の`INIT`の呼び出しは`EXIT`コールをその前に 呼び出す必要があります。 `INIT`は、 PSM ルーチンおよびトリガー中では使用することはできません。

## INSERT

テーブルに新しい行のアトリビュートの値を挿入にします。

構文 |
    EXEC SQL INSERT INTO table
         (attr {, attr}) VALUES (value {, value});
`value` |
    |program variable|
    |constant        |
SQLCODE |
`0` | 正常です。
`-3` | 変換エラーです。(`mxputvs() または mxputi() エラー`).
`-5` | 行の追加ができませんでした。(`mxadd() エラー`).
注意 | テーブル中の属性のうち、`INSERT`コマンドのアトリビュートリストに 指定していないものについては、`NULL`値がその値として挿入されます。 実行時に`NULL`を挿入するために制御変数を使用することができます。 `:variable:control_variable`と指定した場合には、 実行時に`control_variable`の値が評価され、 0 より小さいならば `NULL`が挿入され、 その他の値ならば変数に格納されている値を挿入します。
例 | 次のコマンドは、アトリビュート`name`に`Mosca`、 `number`に`10`、 `credit_limit`に`1500`の値を設定し、 `personnel`テーブルに新しい行を挿入します。
       EXEC SQL INSERT INTO personnel
          (name, number, credit_limit)
           VALUES ("Mosca", 10, 1500);

## OPEN CURSOR

複数行の操作を実行するために指定したカーソルをオープンします。

構文 | `EXEC SQL OPEN cursor_name;`
注意 | カーソルをオープンした場合、その宣言に定義した`SELECT`ステートメントが 初期化されます。 1つのプログラムでは、カーソルは何度でもオープンできます。 ただし、カーソルを再オープンする場合は、カーソルがクローズされていなければ なりません。
SQLCODE |
`0` | 正常です。
`-1` | 誤った`WHERE`句が指定されています。(`mxgetbegin() エラー`)

## OPEN_TABLE

操作のために明示的にオープンします。

構文 |
`EXEC SQL OPEN_TABLE table FOR` | |`UPDATE` |`READ` |`DEFERRED` |`BYPASS_LOCK` | |`` {`, table FOR` | | | | |`UPDATE` |`READ` |`DEFERRED` |`BYPASS_LOCK` | |}`;` | | |
SQLCODE |
`0` | 正常です
`<0` | オープンエラーです。コマンドは中断され、`SQLCODE`には `-(100 + mxoperr)`の値を格納します。 (mxoperr は Empress ホスト言語: C インターフェイス - mx ルーチン マニュアルを参照してください。)
注意 | 実行する各コマンドについて、プリコンパイラは必要なテーブルがすべてオープン されているかどうかをチェックします。 オープンされている場合は、正しいモード(read, update または dirty read) でオープンされています。テーブルがオープンされない場合は、 SQLコマンドに対応したモードでオープンされます。
例 | 次のコマンドは、読み込み処理のためにテーブル`loans`をオープンし、 更新処理のために`personnel`テーブルをオープンします。
       EXEC SQL OPEN_TABLE
          loans FOR READ,
          personnel FOR UPDATE;

## SELECT INTO

テーブルまたはビューから1行のデータを検索して、 指定したプログラム変数に取得した値を格納します。

構文 |
    EXEC SQL SELECT attr {, attr} FROM table {, table}
       INTO variable {, variable}
       [where_clause];
SQLCODE |
`0` | 正常です。
`1` | 行はロックされています。
`-1` | `mxgetbegin() エラー`
`100` | 行は検索されませんでした。
SQLWARN1 |
`''` | 切り詰め処理は実行されていません。
'`W`' | 切り詰め処理は実行されました。
注意 | `SELECT` は、 指定したテーブルまたはビューから1行のデータを検索します。 `WHERE`句が使用された場合、 `WHERE`句の条件を満たす最初のレコードが選択されます。 `WHERE`句の条件を満たす全てのレコードにアクセスしたい場合は、 カーソルを使用する必要があります。 (`OPEN CURSOR`コマンドを参照してください。) 検索において、最初に選択されたアトリビュート値は、 最初に指定したプログラム変数の値として格納されます。 2番目に選択されたアトリビュート値は、2番目に指定したプログラム変数の 値として格納され、それ以降も同様に処理されます。 ジョインを含む`SELECT`においては、 ジョインを形成する右側のアトリビュートに対してプログラム変数を 指定することはできません。
例 | 次のコマンドは、`personnel`テーブルからアトリビュート `name` と `date`の値を検索します。 `WHERE`句の条件に一致する最初のレコードから値が取得され、 こららの値はプログラム変数の`:var1` と `:var2` に格納されます。
       EXEC SQL SELECT name, date FROM personnel
          INTO :var1, :var2 WHERE name='Jones';

## START TRANSACTION

これに続くコマンドに対して、トランザクションを開始します。

構文 |
`EXEC SQL START` | |`TRANSACTION` |`WORK` | |``; |
SQLCODE |
`0` | 正常です。
`-6` | トランザクションを開始できませんでした。
注意 | トランザクションは、検索ループ中から開始することが可能です。

## UPDATE

指定されたテーブルの1つ以上のレコードを指定された値で更新します。

構文 |
    EXEC SQL UPDATE table SET attr = value {, attr = value}

         |where_clause                |;
         |WHERE CURRENT OF cursor_name|
SQLCODE |
`0` | 正常です。
`1` | 1つ以上の行がロックされています。
`-1` | 誤った`WHERE`句が指定されています。 (`mxgetbegin() エラー`)
`-4` | 無効なカーソルです。
`-7` | 行を更新できませんでした。(`mxput() エラー`)
`-8` | 変換エラー (`mxputvs()` または `mxputi() エラー`). `WHERE` 句が含まれている場合は コマンドは中断されます。
注意 | `WHERE`句にカーソルが指定されない場合、 `WHERE`句の条件を満たす全ての行は更新されます。 カーソルが使用されている場合は、カレント行のみ更新されます。 値として、定数、ユーザー変数または アトリビュートの値を削除するための`NULL`が入力可能です。 値とアトリビュートは同じデータタイプである必要があり、 同じではない場合、プリコンパイラはエラーを返します。 制御変数を使用して、実行時に`NULL`を挿入することができます。 値が`:variable : ctrl`である場合、 実行時に `ctrl` がテストされます。 この値が 0 より大きいかどうかによって、 NULL 値あるいは変数の値が挿入されます。 （詳細については「制御変数」を参照してください。） 変数`SQLCNT` は、更新したレコード数を確認するために使用することができます。
例 1 | 次のコマンドは、アトリビュート`credit_limit` and `date`を 指定した値で更新します。 この処理では、`personnel`テーブルの`name`の値が `Jones`であるすべてのレコードを更新します。
       EXEC SQL UPDATE personnel
          SET credit_limit=100, date='19851119'
          WHERE name='Jones';
例 2 | 次のコマンドは、カーソル`c`に関連付けられたコンテキストの カレントレコードのみを更新します。
       EXEC SQL UPDATE personnel
          SET credit_limit=100, date='19851119'
          WHERE CURRENT OF c;

## WHERE

`WHERE`句は、その条件を満たすレコードのセットを決定します。 `WHERE`句は常に他のSQLコマンドのオプションとして使用されます。

`WHERE`句は、真 または 偽で評価するブール式を構成し、 `AND` または `OR`によってブール演算子を結合することにより 複合した`WHERE`句を作成することができます。 複合`WHERE`の各部の演算の順序は括弧を使用して制御することができます。

構文 |
`WHERE` | `|boolean_expr |(boolean_expr) |boolean_expr OR boolean_expr |boolean_expr AND boolean_expr |NOT boolean_expr` | `| | | | |`
| `boolean_expr`は以下のいずれかです。
`attr` | `| | | | | | | | | | | | | | | | | |` | `| = | != | > | > = | < | < = |MATCH |!MATCH |SMATCH |!SMATCH | = | != |[IS] |[IS] NOT BETWEEN` | `| |attr | |program_variable | |constant | | | | |program_variable | |constant | | | NULL | | | operand AND operand` | `| | | | |` | `| | | | | | | | | | | | | | | | | |`
`operand`は以下のとおりです。
|  |  | `|attr |program_variable |constant` | `| [ | |` | `|INCLUSIVE |EXCLUSIVE |` | `|] | |`
SQLCODE | 意味はありません。
注意 | `MATCH`は、大文字と小文字を区別しないパターンマッチングで、 `SMATCH`は、これらを区別するパターンマッチングです。 match キーワードの前に"`!`"が付けられると、 パターンと一致しない全てのレコードを検索します。 `NOT` は"`!`"と同じではないことに注意してください。 "`!`"は演算子に適用されますが、式には適用されません。 ただし、演算子の前に`NOT` を使用した場合は式の前にしていた場合と 同様に処理されます。 `WHERE` とその指定についての詳細は、 Empress SQL: リファレンス の WHERE 句 を参照してください。

## WHENEVER

`WHENEVER`は、プログラムの実行中にエラーが発生した場合に 行うべき処置を定義することができます。

構文 |
`EXEC SQL WHENEVER` | `|SQLERROR |SQLWARNING |NOT FOUND` | `| | |` | `|CONTINUE |GOTO statement_label` | `|; |`
SQLCODE | 意味はありません。
注意 | `SQLERROR`に指定した処置は、エラー状況が検出されると実行されます。 `SQLWARNING`に指定した処置は、例外状況が検出されると実行されます。 `NOT FOUND`に指定した処置は、行が返されない場合、あるいは行が見つからない 場合に実行されます。 `CONTINUE` と`GOTO`は、 エラー状況、例外状況、または行の使用不可の場合に それぞれに実行される処置です。 実行すべき処置を変更するために `WHENEVER`句はプログラム中に複数指定することができます。 `WHENEVER`ステートメントの適用範囲は、そのステートメントから 同じ演算子 (`SQLERROR`、`SQLWARNING` 、 `NOT FOUND`)を持つ 次の`WHENEVER`ステートメントの間に発生したエラー、 あるいはプロシージャの最後までに発生したエラーになります。