レコードの読み取りと書き込み

頭字語 CRUD は、ファイル内のレコードに対して通常実行する、基本的な入出力機能のことを 指します。下の表に、CRUD 機能と、その機能を提供する EGL キーワードを示します。

表 1. EGL の CRUD 機能
CRUD 機能 EGL キーワード
作成 add
読み取り get
更新 replace
削除 delete

さらに EGL では、作業を実行するファイルのタイプに応じて、 各機能の実行方法を個別に調整します。 例えば、SQL データベース用の get next ステートメントが 記述されている場合、EGL は SQL の結果セットから該当する行を見つけて取得するために、 一連の SQL ステートメントを生成します。 同一の EGL ステートメントが順次ファイル用に生成されますが、 こちらは単純に、ファイル内にある次のレコードの読み取りを行います。

EGL では、ステレオタイプ という手段を用いて、これらのタスクを実行します。 日常の使用において、ステレオタイプとは、個々を特性化するために使用できる共通のパターンです。 ほぼ同様の方法で、ステレオタイプをレコードに適用する際には、 そのレコードに関連する入出力機能の実行方法を、EGL に対して指示します。 ステレオタイプについての詳細は、レコード・パーツの概要、および 「EGL 言語解説書」の特定のステレオタイプについて書かれたトピックを参照してください。

入出力処理のサイクル

データベースが既に存在しており (通常は、データベース管理者が作成します)、定期的な処理 (通常は、作成、読み取り、更新、および削除 (CRUD) の機能) が含まれているものとします。具体例については、具体的なデータ・アクセス・テクノロジーを扱っている トピックに記載されています。 以下の汎用的なシナリオが成立しているのは、 実装の詳細をユーザーに知られないようにするために、EGL が有効であるためです。

まず、レコードの定義から開始します。これは、その他のパーツの外部で行う必要があります。
package com.companyb.customer

Record CustomerRecord type Stereotype
  customerNumber INT;
  customerName STRING;
  customerBalance MONEY;
end

レコードの詳細とそのプロパティーは、レコードをどのように使用するかに応じて 変化します。

次に、プログラムの本体で、このレコード・パーツに基づいて変数を宣言します。
myCustomer CustomerRecord;
既存のお客様レコードを検索するには、そのレコードに関する情報に、 固有の部分があることが必要となります。 通常、これは何らかの ID 番号を意味します。 この番号は、ファイルに対する キー として、 もっぱら使用されています。 キーは、ファイルに索引を付けるために使用される、データの一部分のことを指します。 これによって、必要なレコードを見つける際に、 すべてのレコードを参照しなくて済むようになります。 ユーザーに対してお客様番号の入力を求めて、 その番号を返す、getCustomer() という関数が別途記述されているとします。
myCustomer.customerNumber = getCustomer();
要求された番号と一致する情報を読み取るには、単に次のようなコードを記述します。
get myCustomer forUpdate;

ファイルまたはデータベースからデータを読み取るための 適切なコードが、EGL によって生成され、レコード変数に情報が配置されます。 forUpdate キーワードは、EGL に対して、 データを置換または削除できるように、そのデータを予約するよう指示します。

この情報に変更オプションを付けて、ユーザーに提供することができます。 showCustomer() という関数が、別途記述されているとします。 この関数は、ユーザーがレコードを削除する場合は -1 を、 レコードが変更されていない場合は 0 を、 ユーザーがレコードに何らかの変更を加えた場合は 1 を返します。
case (showCustomer(myCustomer))
  when (-1)
    delete myCustomer;
  when (1)
    replace myCustomer;
end
エラーを処理する場合は (エラーの処理を参照)、 getCustomer() から返される数値を使用して、 もう少し詳細な処理を実行できます。 getReply() という関数が、別途記述されているとします。この関数では、指定された質問に対してユーザーが Y または N の どちらを回答したかに応じて、TRUE または FALSE を返します。
set myCustomer empty;            // すべてのフィールドがブランクまたは 0
myCustomer.customerNumber = getCustomer();   // お客様番号の設定
  
try
  get myCustomer forUpdate;
onException (ex AnyException)      // レコードを取得できない
  if(myCustomer is noRecordFound)  // ファイル上にお客様番号がないため
    if(getReply("このお客様を追加しますか?  (y/n)") == TRUE)
      showCustomer(myCustomer);    // ユーザーに残りのフィールドを入力させる
      add myCustomer;
    end
  else
    myErrorHandler(ex);
end

このように比較的少ない行数のコードで、 カスタマー・ファイル・サービス・プログラムの中心部分を作成できます。 これを、SQL データベースまたは独自の VSAM 索引付きファイルに対して、 使用することができます。 VSAM 用のプログラムと SQL 用のプログラムの違いは、CustomerRecord 定義に 対して適用するステレオタイプのみです。


フィードバック