SQL の execute に関する考慮事項

SQL のコンテキストでは、EGL execute 文の一般的な用途は、動的要素を使用した準備済み SQL 文を実行することです。

この文を使用して、暗黙の delete、insert、または update 照会を作成したり、 使用可能なコマンドの限られたリストから組み込み SQL を作成したりすることもできます。

構文

execute 文の構文図
preparedStatementID
EGL prepare 文を使用する際に、準備済み SQL コードに代入した識別子。 これは最も一般的な execute 文の使用法であり、通常は動的 SQL を含みます。 動的 SQL について詳しくは、SQL データ・アクセスを参照してください。
using ... field
実行時に準備済み SQL 文から使用可能な EGL ホスト変数 (ホスト変数を参照) を識別します。 #sql ブロックの外側にある、このような文節ではホスト変数名の前にコロンを挿入しないでください。
for SQLRecordVariable
暗黙の SQL 文 (delete、insert、または update) を作成する場合、EGL では、この SQL レコード変数を使用して、その文の内容を決定します。 これについては、このトピックの『暗黙の SQL コードの生成』で説明しています。 以下の例のように、SQL レコードを使用して操作の結果をテストすることができます。
onException (sqlEx SQLException)
  if (myCustomer is unique)
    myErrorHandler(8); 
  end 
end
deleteinsertupdate
これらのキーワードは、指定したタイプの暗黙の SQL 文を要求する場合に使用します。 暗黙の SQL 文の概要については、SQL データ・アクセスを参照してください。 これらのキーワードのいずれかを使用する場合は、SQL レコード変数を execute 文に含めてください。
#sql{ sqlStatement }
このタイプの組み込み SQL 文の使用法について詳しくは、sql ディレクティブを参照してください。SQL 文で結果セットの行をアップデートするか、削除する場合は、以下の文節を含む SQL UPDATE または DELETE 文をコーディングします。
  WHERE CURRENT OF resultSetID
resultSetID
結果セットを使用可能にした EGL open 文または get 文に指定された resultSetID。

#sql と左中括弧の間にスペースを入れないでください。

暗黙の SQL コードの生成

execute 文を使用して暗黙の SQL を生成し、最初に EGL の open または get を実行せずに、特定のデータベース操作を実行することができます。 通常、EGL は、SQL データベース・アクセスの詳細 (結果セットの行の位置の操作など) を隠します。 execute 文で、SQL レコード・パーツの defaultSelectCondition プロパティーを設定することにより、変更したいデータベースの行を直接指定できます。

例えば、CustomerRecord パーツに defaultSelectCondition を設定し、5 年間全く活動しなかったすべての顧客を検索することができます。 (これを実行する方法について詳しくは、#sqlCondition ディレクティブを参照してください。) その後、関連付けられた myCustomer SQL レコード変数からそのキー・フィールドをクリアすると、すべての顧客番号がフィルターを通るようになります。 結果セットを作成する必要なしに、選択したすべての顧客を顧客データベースから除去するには、次の EGL ステートメントを使用します。
execute delete myCustomer;

保護がないため、これらの暗黙の SQL コマンドを使用する際は注意してください。

暗黙の SQL DELETE

暗黙の SQL DELETE 文は、defaultSelectCondition SQL レコード・プロパティーを使用して、削除するテーブル行を決定します。 これは、SQL テーブルの各キー列の値が、SQL レコード変数の対応するキー・フィールドの値と等しいことが前提です。 レコード・キーもデフォルトの選択条件も指定しなかった場合は、すべてのテーブルの行が削除されます。

EGL が生成する暗黙の SQL DELETE 文には次の構文があります。
  DELETE FROM tableName
  WHERE  [ defaultSelectCondition AND ]
         keyColumn01 = :keyField01 [ AND
         ...
         keyColumnnn = :keyFieldnn ]

単一 EGL 文を使用して、複数のデータベース表から行を削除することはできません。

暗黙の SQL INSERT

デフォルトで、暗黙の SQL INSERT 文は以下のアクションを実行します。
  • SQL レコード変数のキー値により、テーブル内でのデータの論理位置が判別されます。 キーを持たないレコードは、SQL テーブルの定義とデータベースの規則に従って処理されます。
  • SQL レコード宣言におけるレコード・フィールドと SQL テーブルの列の関連付けの結果、 生成されたコードが、レコード変数の各フィールドのデータを、関連する SQL テーブル列に配置します。
  • レコード・フィールドを読み取り専用として宣言した場合、生成された SQL INSERT 文にそのレコード・フィールドは組み込まれず、データベース管理システムは、関連する SQL テーブル列の値を、その列を定義する際に指定したデフォルト値に設定します。
EGL が生成する暗黙の SQL INSERT 文の構文は、次のようになります。
  INSERT INTO tableName
    (column01, ... columnNN)
    values (:recordField01, ... :recordFieldNN)

暗黙の SQL UPDATE

デフォルトで、暗黙の SQL UPDATE 文は以下のアクションを実行します。
  • 各 SQL テーブルのキー列の値が、SQL レコードの対応するキー・フィールドの値と等しい場合は、defaultSelectCondition SQL レコード・プロパティーにより、選択するテーブル行が決定されます。 レコード・キーもデフォルトの選択条件も指定しなかった場合は、すべてのテーブルの行が更新されます。
  • SQL レコード宣言におけるレコード・フィールドと SQL テーブルの列の関連付けの結果、 特定の SQL テーブルの列が、レコード変数の関連するフィールドのコンテンツを受け取ります。 ただし、読み取り専用のレコード・フィールドに関連付けられている SQL テーブルの列は更新されません。
暗黙の SQL UPDATE 文の構文は次のようになります。
  UPDATE tableName
  SET    column01 = :recordField01, 
         column02 = :recordField01, ... 
         columnNN = :recordFieldNN
  WHERE  keyColumn01 = :keyField01 [ AND
         ...
         keyColumnnn = :keyFieldnn ] 

組み込み SQL

execute 文を使用すると、最初に open または get を実行しなくても、データベースから長い、一連の行を削除できます。 一連の行を削除するには、SQL DELETE 文に、削除の条件を設定する WHERE 文節を組み込みます。 以下は、ある企業が、targetDate (EGL コードに以前に設定した日付) 以降一度も注文を行っていないすべての顧客のデータベースをパージする例です。
execute #sql{
  DELETE FROM Customer
  WHERE last_order_date < :targetDate
};

EGL 変数 targetDate が、SQL コードのホスト変数 (前にコロンが付く) になります。詳しくは、ホスト変数を参照してください。

注: 複数行操作では、構造化レコード内の静的配列をホスト変数として使用できません。

同様の構文を使用して、SQL の INSERT 文または UPDATE 文を組み込むこともできます。

EGL の execute 文を使用して、結果セットを戻す SQL 文を組み込むことはできません。 これは、ユーザーがカーソルを直接制御することができないためです。カーソルの定義と管理は、すべて EGL が内部的に処理します。

以下の型の SQL 文を発行するために execute 文を使用できます。
  • ALTER
  • CALL
  • CREATE ALIAS
  • CREATE INDEX
  • CREATE SYNONYM
  • CREATE TABLE
  • CREATE VIEW
  • DECLARE GLOBAL TEMPORARY TABLE
  • DELETE
  • DROP INDEX
  • DROP SYNONYM
  • DROP TABLE
  • DROP VIEW
  • GRANT
  • INSERT
  • LOCK
  • RENAME
  • REVOKE
  • SAVEPOINT
  • SET
  • SIGNAL
  • UPDATE
  • VALUES
以下の型の SQL 文を発行するために execute 文を使用することはできません。
  • CLOSE
  • COMMIT
  • CONNECT
  • CREATE FUNCTION
  • CREATE PROCEDURE
  • DECLARE CURSOR
  • DESCRIBE
  • DISCONNECT
  • EXECUTE
  • EXECUTE IMMEDIATE
  • FETCH
  • OPEN
  • PREPARE
  • ROLLBACK WORK
  • SELECT
  • INCLUDE SQLCA
  • INCLUDE SQLDA
  • WHENEVER

次にいくつかの execute 文の例を挙げます。 これらの例では、myCustomer が SQL レコード変数です。
execute #sql{ 
  create table Customer (
    customer_number int not null,
    customer_name char(40) not null,
    customer_balance decimal(9,2) not null)
};

execute update for myCustomer;

execute #sql{ 
  call aStoredProcedure( :parameterVar)
};

execute myPreparedStatement;

エラー条件

暗黙の delete、insert、または update 照会を呼び出して、SQL レコード変数を指定しないと、宣言時間エラーが発生します。

唯一の使用可能なホスト変数が、読み取り専用である場合、暗黙の insert または update 照会にエラーが発生します。


フィードバック