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


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




BEGIN DECLARE SECTION

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

構文

EXEC SQL BEGIN DECLARE SECTION;

SQLCODE

意味はありません。

注意
  1. ホスト言語の変数宣言の規則に従えば、宣言セクションはどの位置に記述しても構いません。

  2. 1つのプログラムで複数の宣言セクションを記述が可能ですが、 複数の宣言セクションを記述する場合は、宣言セクションをとおして 変数名は一意である必要があります。

  3. 宣言セクションは、SQL プリコンパイラステートメントを含むファイル内で グローバル(global)として宣言することを推奨します。

  4. 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

意味はありません。

注意
  1. CANCEL TRANSACTION は、すべてのデータベース上にわたる すべてのトランザクションをロールバックします。

  2. 検索ループ内で用いられた場合、 カレントレコードは有効ではありません。 ただし、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

意味はありません。

注意
  1. データベース名は、フルパスで指定することができます。 この場合、引用符で囲む必要があります。

  2. 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. カーソルをオープンして使用するためには最初に宣言しなくてはなりません。 カーソルを宣言した後に使用する前にはオープンする必要があります。

  2. 1つのプログラムでは、カーソルは1度だけ宣言できます。

  3. 検索した行を読むだけでなく修正したい場合、 カーソルはFOR UPDATEまたはFOR DEFERREDで宣言しなくてはなりません。

  4. 検索した行のソートはSORTオプションを利用することで可能です。
   EXEC SQL DECLARE c1 CURSOR FOR
      SELECT FROM personnel, loans
      WHERE personnel.name='Jones'
         AND personnel.name = loans.name;

上記のコマンドはc1というカーソルを宣言します。 このカーソルは、テーブルpersonnelloans から検索した行に対して処理を行います。 レコード検索の条件は、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 無効なカーソルです。

注意
  1. カーソルをWHERE 句に指定しない限り、WHERE 句を満たす行すべてが 削除されます。 カーソルを指定した場合は、カレント行だけが削除されます。 カレント行がない場合は、レコードは削除されず、 適切なSQLCODEが戻されます。

  2. 変数 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

意味はありません。

注意
  1. プログラムを終了する前は常にEXITを実行する必要があります。

  2. EXITを実行した以降においては INITを含む、 SQL 操作をおこなうことはできません。

  3. 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という名前のカーソルに関連付けられたコンテキストで 次に処理可能なレコードをカレントレコードとします。 アトリビュートnamecredit_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という名前のカーソルに関連付けられたコンテキストで カレントレコードからアトリビュートnamecredit_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は、既にコールされています。

注意
  1. INITは、プログラム中で使用する 最初に実行可能なEmpress プリコンパイラコマンドで なければなりません。

  2. INITは、プログラム実行中に何回か呼び出される可能性がありますが 後のINITの呼び出しはEXITコールをその前に 呼び出す必要があります。

  3. INITは、 PSM ルーチンおよびトリガー中では使用することはできません。



INSERT

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

構文
EXEC SQL INSERT INTO table
     (attr {, attr}) VALUES (value {, value});
value
|program variable|
|constant        |

SQLCODE
0 正常です。
-3 変換エラーです。(mxputvs() または mxputi() エラー).
-5 行の追加ができませんでした。(mxadd() エラー).

注意
  1. テーブル中の属性のうち、INSERTコマンドのアトリビュートリストに 指定していないものについては、NULL値がその値として挿入されます。

  2. 実行時にNULLを挿入するために制御変数を使用することができます。 :variable:control_variableと指定した場合には、 実行時にcontrol_variableの値が評価され、 0 より小さいならば NULLが挿入され、 その他の値ならば変数に格納されている値を挿入します。

次のコマンドは、アトリビュートnameMoscanumber10credit_limit1500の値を設定し、 personnelテーブルに新しい行を挿入します。

   EXEC SQL INSERT INTO personnel
      (name, number, credit_limit)
       VALUES ("Mosca", 10, 1500);



OPEN CURSOR

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

構文

EXEC SQL OPEN cursor_name;

注意
  1. カーソルをオープンした場合、その宣言に定義したSELECTステートメントが 初期化されます。

  2. 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' 切り詰め処理は実行されました。

注意
  1. SELECT は、 指定したテーブルまたはビューから1行のデータを検索します。 WHERE句が使用された場合、 WHERE句の条件を満たす最初のレコードが選択されます。 WHERE句の条件を満たす全てのレコードにアクセスしたい場合は、 カーソルを使用する必要があります。 (OPEN CURSORコマンドを参照してください。)

  2. 検索において、最初に選択されたアトリビュート値は、 最初に指定したプログラム変数の値として格納されます。 2番目に選択されたアトリビュート値は、2番目に指定したプログラム変数の 値として格納され、それ以降も同様に処理されます。

  3. ジョインを含むSELECTにおいては、 ジョインを形成する右側のアトリビュートに対してプログラム変数を 指定することはできません。

次のコマンドは、personnelテーブルからアトリビュート namedateの値を検索します。 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 句が含まれている場合は コマンドは中断されます。

注意
  1. WHERE句にカーソルが指定されない場合、 WHERE句の条件を満たす全ての行は更新されます。 カーソルが使用されている場合は、カレント行のみ更新されます。

  2. 値として、定数、ユーザー変数または アトリビュートの値を削除するためのNULLが入力可能です。

  3. 値とアトリビュートは同じデータタイプである必要があり、 同じではない場合、プリコンパイラはエラーを返します。

  4. 制御変数を使用して、実行時にNULLを挿入することができます。 値が:variable : ctrlである場合、 実行時に ctrl がテストされます。 この値が 0 より大きいかどうかによって、 NULL 値あるいは変数の値が挿入されます。 (詳細については「制御変数」を参照してください。)

  5. 変数 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

意味はありません。

注意
  1. MATCHは、大文字と小文字を区別しないパターンマッチングで、 SMATCHは、これらを区別するパターンマッチングです。 match キーワードの前に"!"が付けられると、 パターンと一致しない全てのレコードを検索します。

  2. NOT は"!"と同じではないことに注意してください。 "!"は演算子に適用されますが、式には適用されません。 ただし、演算子の前にNOT を使用した場合は式の前にしていた場合と 同様に処理されます。

  3. WHERE とその指定についての詳細は、 Empress SQL: リファレンス WHERE 句 を参照してください。




WHENEVER

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

構文
EXEC SQL WHENEVER |SQLERROR
|SQLWARNING
|NOT FOUND
|
|
|
|CONTINUE
|GOTO statement_label
|;
|
SQLCODE

意味はありません。

注意
  1. SQLERRORに指定した処置は、エラー状況が検出されると実行されます。 SQLWARNINGに指定した処置は、例外状況が検出されると実行されます。 NOT FOUNDに指定した処置は、行が返されない場合、あるいは行が見つからない 場合に実行されます。

  2. CONTINUEGOTOは、 エラー状況、例外状況、または行の使用不可の場合に それぞれに実行される処置です。

  3. 実行すべき処置を変更するために WHENEVER句はプログラム中に複数指定することができます。

  4. WHENEVERステートメントの適用範囲は、そのステートメントから 同じ演算子 (SQLERRORSQLWARNINGNOT FOUND)を持つ 次のWHENEVERステートメントの間に発生したエラー、 あるいはプロシージャの最後までに発生したエラーになります。