本文へスキップ
BecomeCoder

COBOLコース · 第8章 索引編成ファイルとランダムアクセス · レッスン43

索引ファイルの更新 ― WRITE / REWRITE / DELETE

ローカル実施

導入

索引編成ファイルは「読む」だけでなく、「新しいレコードを追加する」「既存のレコードを書き換える」「レコードを削除する」といった更新操作もキー指定で行えます。この3つの命令を見ていきましょう。

説明

WRITE(新規追加)

       PROCEDURE DIVISION.
           OPEN I-O CUSTOMER-FILE.

           MOVE 100500 TO CUST-ID.
           MOVE "ITO KENJI" TO CUST-NAME.
           MOVE 0 TO CUST-BALANCE.
           WRITE CUSTOMER-RECORD
               INVALID KEY
                   DISPLAY "この顧客番号はすでに存在します"
           END-WRITE.
  • OPEN I-O CUSTOMER-FILE. … 索引編成ファイルを入出力両用で開くモード。読み込みと書き込みの両方を行いたいときに使います(順編成ファイルの OPEN INPUT / OPEN OUTPUT とは別に、索引編成では I-O がよく使われます)。
  • WRITE CUSTOMER-RECORD … 新しいレコードを追加。このとき INVALID KEY は「同じキーがすでに存在する」ことを意味します(索引編成ファイルではキーの重複は許されません)。

REWRITE(既存レコードの更新)

           MOVE 100234 TO CUST-ID.
           READ CUSTOMER-FILE
               INVALID KEY
                   DISPLAY "更新対象が見つかりません"
               NOT INVALID KEY
                   ADD 5000 TO CUST-BALANCE
                   REWRITE CUSTOMER-RECORD
                       INVALID KEY
                           DISPLAY "更新に失敗しました"
                   END-REWRITE
           END-READ.
  • REWRITE CUSTOMER-RECORDすでに読み込んだレコードの内容を書き換える命令。手順として「まずREADで対象を読み込み、値を変更し、REWRITEで書き戻す」という流れが定番です。

DELETE(削除)

           MOVE 100999 TO CUST-ID.
           DELETE CUSTOMER-FILE
               INVALID KEY
                   DISPLAY "削除対象が見つかりません"
               NOT INVALID KEY
                   DISPLAY "削除しました"
           END-DELETE.
  • DELETE CUSTOMER-FILECUST-IDにセットしたキーのレコードを削除する。

3つの命令をまとめると、次のようになります。

命令役割INVALID KEY の意味
WRITE新規レコードの追加同じキーがすでに存在する
REWRITE既存レコードの書き換え対象のキーが見つからない(READ済みでない)
DELETEレコードの削除対象のキーが見つからない

このパターンは、口座残高の更新(READして値を確認 → 計算 → REWRITEで書き戻す)のような、実務のバッチ処理・オンライン処理の両方で頻繁に使われます。

試すには

「新しい顧客を1件追加する(WRITE)」→「その顧客の残高に1000円足す(READしてREWRITE)」→「別の顧客を1件削除する(DELETE)」という3つの操作を順番に行うプログラムを、頭の中で組み立ててみましょう。