SQL の add に関する考慮事項

SQL 照会言語のコンテキストでは、add 文は、レコードまたはレコードのセットをデータベースに追加します。

EGL は、レコード変数のキー・フィールドの値に基づき、情報を追加します。

EGL は、EGL add 文にある SQL レコード変数の値およびプロパティーに基づき、生成したコードに SQL INSERT 文を作成します。 この暗黙の SQL コードについて詳しくは、SQL データ・アクセスを参照してください。 あるいは、#sql ディレクティブを使用して、 独自の組み込み SQL INSERT 文を作成することもできます (sql ディレクティブを参照)。

add 文は、単一の SQL レコード変数を指定する場合、データベースに単一行を作成します。 また、SQL レコード変数の動的配列を指定することもできます。 その場合、add 文で配列の各メンバーに行が作成されます。

構文

add 文の構文図
SQLRecordVariable
データベースに追加する単一行のデータを含むメモリー領域を参照します。
with #sql{ sqlStatement }
経験豊かな SQL プログラマーであれば、独自の SQL INSERT 文を組み込むことにより、 EGL が生成する SQL コードをオーバーライドできます (sql ディレクティブを参照)。 #sql と左中括弧の間にスペースを入れないでください。
SQLDynamicArray
SQL レコードの動的配列の名前。各要素は、要素固有のキー値によって指定されるデータベース内の位置に挿入されます。 操作は、最初のエラー時に、またはすべての要素が挿入されたときに停止します。
Atomic
AtomicAtomic(no) をサポートします。
Atomic は、すべての行を正しく挿入する必要があることを意味します。そうしない場合、複数行の挿入は失敗します。 これはデフォルトです。
Atomic(no) は、行セット内の個々の行を正しく挿入するか、拒否できることを意味します。 GET DIAGNOSTICS を使用すると、正常に処理されなかった行を判別することができます。 SQL の get diagnostics に関する考慮事項を参照してください。
注:
  1. add Atomic は、ロギング・モードになっていない Informix® ではサポートされません。従来どおり、アトミック以外の方法を使用して追加されます。
  2. add Atomic(no) は、データベースによって動作が異なります。Oracle、DB2® for i5/OS™、SQL Server では、1 回失敗すると行を挿入しません。他のデータベースは、失敗した行を除くすべての行を挿入します。
制約事項: 複数行に対しては、add ステートメントは明示的な SQL ステートメントをサポートしません。

暗黙の SQL INSERT 文

add 文で SQL レコードの変数または配列を指定したにもかかわらず、#sql ディレクティブで組み込み SQL 文を指定していない場合は、暗黙の SQL コードが作成されます。 EGL が生成する暗黙の SQL INSERT 文の書式は、次のコードのようになります。
  INSERT INTO tableName
    (column01, ... columnNN)
    values (:recordItem01, ... :recordItemNN)

テーブル内でのデータの論理位置は、レコード内のキー値によって決まります。 データベース管理システムは、SQL テーブルの定義とデータベースの規則に従って、キーを持たないレコードを処理します。 レコード変数のベースとなるレコード・パーツは、レコード・フィールドをデータベース表の列と関連付けます。 EGL はこれらの関連付けを使用して、INSERT 文の値の代入を決定します。 ホスト変数 (SQL をホストする言語 (この場合は EGL) で定義した変数) の使用法は、先頭のコロン文字によって示されます。 詳しくは、ホスト変数を参照してください。

レコード・フィールドが読み取り専用として宣言されている場合、生成された SQL INSERT 文にはそのフィールドが含まれず、 データベース管理システムでは、関連する SQL テーブル列の値がデフォルト値 (その列が定義されたときに指定された値) に 設定されます。

次の例は、add ステートメントを示しています。

if (userRequest == "A")
   try
      add record1;
   onException(sqlEx SQLException)
      myErrorHandler(12);
   end
end
SQL レコードの動的配列を使用する例は、以下のとおりです。
try
   add employees;
onException(sqlEx SQLException)
   sysLib.rollback();
end

エラー条件

以下のような状況があると、エラーが発生します。
  • #sql ディレクティブで INSERT 型以外の型の SQL 文を指定する。
  • #sql ディレクティブで、SQL INSERT 文の全部ではなく一部の文節を指定する。
  • 次のいずれかの特徴を持つ SQL INSERT 文を指定する (または EGL コードが暗黙の SQL 文を生成する)。
    • 複数の SQL テーブルに関連付けられている。
    • すべてのホスト変数が読み取り専用と宣言された。
    • 存在しないか、関連するホスト変数との互換性がない列に関連付けられている。

フィードバック