EGL add 文は、ファイル、メッセージ・キュー、またはデータベースの中にレコードを書き込みます。またはデータベースにレコード・セットを書き込みます。
以下に例を示します。
if (userRequest == "A") try add record1; onException myErrorHandler(12); end end
add 文の振る舞いは、レコード・タイプによって異なります。DL/I 処理の詳細については、『DLISegment レコード』を参照してください。 SQL 処理の詳細については、『SQL レコード』を参照してください。
add 文は DL/I ISRT 文を生成します。DL/I では、この挿入はたとえそれがどこであろうと、データベース中の現行位置で起こります。この位置は、例えば、set record position 文を使用することにより、get 文を使用することにより、または修飾された SSA を #dli ディレクティブで作成することにより、ご使用の EGL プログラムのキーを (下記の例に示すように) 明示的に設定することによって、制御できます。
//レコードのインスタンスを作成する myCustomer CustomerRecord; myLocation LocationRecord; myOrder OrderRecord; //セグメント検索引数を作成する myCustomer.customerNo = "005001"; myLocation.locationNo = "000022"; //オーダー・レコードのフィールドに書き込む fillOrder(myOrder); //新規のオーダー・レコードを追加する try add myOrder; onException myErrorHandler(2); endこの add 文から次の擬似 DL/I コードが生成されます。
ISRT STSCCST (STQCCNO = :myCustomer.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo) STPCORD顧客とロケーションに関する修飾セグメント検索引数 (SSA) は、新規のオーダー・セグメントの親セグメントを識別します。 DL/I は、そのセグメントの keyItem フィールド、orderDateNo (STQCODN) によって決定される位置に新規のオーダー・セグメントを追加します。
if (myOrder is unique) ... end考えられるランタイム・エラーには次のものがあります。
add myCustomer, myLocation, myOrder;EGL はこの文から次の擬似 DL/I コードを生成します。
ISRT STSCCST*D (STQCCNO = :myCust.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo) STPCORD
索引付きレコードを追加するときは、レコード内のキーによって、ファイル内でのレコードの論理位置が判別されます。 既に使用されているファイル位置にレコードを追加すると、 ハード入出力エラー UNIQUE、または (重複が許可されている場合は) ソフト入出力エラー DUPLICATE になります。
MQ レコードを追加するとき、レコードはキューの最後に入れられます。 この追加処理は、add 文で以下に示す 1 つ以上の MQSeries® 呼び出しが呼び出されることによって行われます。
相対レコードを追加するときは、キー項目によって、ファイル内でのレコードの位置が指定されます。 ただし、既に使用されているファイル位置にレコードを追加すると、 ハード入出力エラー UNIQUE になります。
シリアル・レコードを追加するとき、レコードはファイルの末尾に入れられます。
生成されたプログラムでシリアル・レコードが追加されてから、 同じファイルに対して get next 文が発行されると、 get next 文が実行される前に、 ファイルが閉じられてから再び開かれます。 したがって、add 文の後に実行される get next 文では、ファイル内の最初のレコードが読み取られます。この振る舞いは、get next 文と add 文が別々のプログラムにあり、一方のプログラムで他方のプログラムが呼び出される場合にも起こります。
複数のプログラムで同時に同じファイルが開かないようにしておくことをお勧めします。
CICS® for z/OS® では、同じスプール・ファイルに関する add 文と get next 文を組み合わせて 1 つのプログラムに組み込むことはできません。 この制限は、add 文と get next 文が別々のプログラムにあり、一方のプログラムが他方のプログラムを呼び出す場合にも適用されます。同様に、get 文または get next 文 に続く add 文は、ファイルの先頭にレコードを追加します。
IMS™ BMP または z/OS バッチでは、GSAM と関連付けられたファイルに可変長のシリアル・レコードを追加した場合に、レコード長が物理ファイルよりも長いときには、DL/I は空白の状況コードを戻します。 データは切り捨てられますが、状況は検出できないのでメッセージは発行されません。
IMS/VS では、シリアル・レコードを代替 PCB (PSB 中の TP PCB) に関連付ける必要があります。IMS のメッセージ・ヘッダー (長さ、ZZ フィールド、およびトランザクション・コード) は、メッセージ・キューに書き込まれた各レコードに自動的に追加されます。 メッセージ・キューに割り当てられたシリアル・レコードに関する EGL の add 文の結果、メッセージ・キューへの ISRT 呼び出しが行われます。エラーが発生し、レコードが複数セグメントのメッセージ・キューに割り当てられて特別代替 PCB と関連付けられると、既に追加されていたすべてのレコードは、明示的な close 文がなくてもコミットされます。 これらのレコードがコミットされないこと、新たな明示代替 PCB を PSB 中に含めること、およびファイルを追加の明示代替 PCB と関連付けることが大切です。
INSERT INTO tableName (column01, ... columnNN) values (:recordItem01, ... :recordItemNN)
try add employees; onException sysLib.rollback(); end