COBOLの「DELETE文」とは?書き方から注意点まで徹底解説

2025年4月11日金曜日

COBOL

「COBOL DELETE文」、ファイル操作でレコードを削除したいときに使う、あの命令ですね。

でも大丈夫! この記事では、COBOLのDELETE文について、その基本的な役割から書き方、実際の使い方、さらには「あちゃー!」となりがちな注意点まで、まるっと解説していきます。

この記事を読めば、DELETE文のモヤモヤがスッキリ晴れて、自信を持ってファイル操作ができるようになりますよ! さあ、一緒にDELETE文マスターを目指しましょう!

この記事で学べること

  • DELETE文が何をする命令なのか
  • DELETE文の基本的な書き方のルール
  • DELETE文を試すためのサンプルファイルの作り方
  • DELETE文を使ったサンプルプログラムとその動き
  • DELETE文を使うときに気をつけるポイント

COBOLの「DELETE文」とは?ファイルからレコードを削除する命令

まず、COBOLのDELETE文がどんなお仕事をする命令なのか、ざっくり掴んでおきましょう。

一言でいうと、DELETE文はファイルの中に記録されている、もういらなくなったレコード(データの行)を削除するための命令です。
例えば、会員名簿ファイルから、退会した人の情報レコードを消したい、といった場面で使います。

ファイルを読み込むREAD文、新しく書き込むWRITE文、内容を更新するREWRITE文といった仲間たちがいますが、DELETE文は「消す」専門の命令だと覚えておきましょう。

ただし、データベースのDELETE文みたいに、いきなり条件を指定してバサッと消せるわけではなく、COBOLならではのちょっとした手順が必要になります。そのあたりも、これから見ていきましょうね。

COBOLの「DELETE文」基本的な書き方

DELETE文の基本的な形は、実はとってもシンプルです。
まずは、一番基本的な形を見てみましょう。

DELETE ファイル名 RECORD

たったこれだけ? と思うかもしれませんが、基本はこれなんです。
もちろん、使うファイルの種類によっては、もう少し付け加えることもありますが、まずはこの形を頭に入れてください。
それぞれの部分が何を表しているのか、少し詳しく見ていきましょう。

ファイル名の指定方法

構文の「ファイル名」の部分には、どのファイルからレコードを削除したいのかを指定します。

ここで指定するファイル名は、プログラムの最初の方にある `ENVIRONMENT DIVISION` の `SELECT`句で指定したファイル名と同じものを書きます。

例えば、`SELECT 会員ファイル ASSIGN TO 'KAIIN.DAT'` みたいに書いていたら、DELETE文では `DELETE 会員ファイル RECORD` のように書く、という具合です。

`DATA DIVISION` の `FD`宣言(ファイル記述項)で定義するレコード名ではなく、`SELECT`句で使ったファイル名を書く、と覚えておきましょう。

RECORDキーワードの意味

次に、「RECORD」というキーワードです。

これは、「今、まさに読み込んだレコードを削除対象にしますよ」という合図のようなものです。

COBOLのDELETE文は、基本的に「直前にREAD文で読み込んだレコード」を削除する、というルールになっています。

だから、「どのレコードを消すの?」というのを明確にするために、この `RECORD` というキーワードが必須になります。省略はできませんので、忘れないようにしましょうね! まさに「お約束」のキーワードです。

COBOLの「DELETE文」を試してみよう

サンプルで使うファイルを用意しよう

DELETE文の動きを見る前に、まずは削除対象となるレコードが入ったファイルを用意する必要がありますね。

いきなりDELETEプログラムを動かしても、元になるファイルがなければ試せません。

ここでは、簡単な社員情報ファイル(索引編成ファイル)を作成する手順を見ていきましょう。

DELETE文のサンプルとしてよく使われるのは、特定のキー(例えば社員番号)でレコードを管理する「索引編成ファイル」です。

今回は、以下のような構造の社員ファイル `SHAIN.DAT` を作成することにします。

  • ファイル名: SHAIN.DAT
  • ファイルの種類: 索引編成ファイル (ORGANIZATION IS INDEXED)
  • レコードの構成:
    • 社員番号 (SHAIN-BANGOU): 4桁の文字 (PIC X(4)) ← これがキーになります
    • 氏名 (SHAIN-NAME): 10桁の文字 (PIC X(10))
    • 年齢 (SHAIN-AGE): 2桁の数字 (PIC 9(2))

このファイルに、いくつかテスト用のデータを入れておくわけですが、完成したファイルの中身は、テキストエディタなどで無理やり開くと(※実際は索引ファイルなので、専用ツールで見るのが普通です)、例えばこんな風に見えるイメージです。

これが今回のサンプルファイルの「見本」となります。

0001TANAKA    25
0002SUZUKI    30
0003SATOU     28

↑ あくまで見本ですよ! 社員番号、氏名、年齢が一続きの固定長データ(レコード)として、複数行記録されている感じです。

では、この `SHAIN.DAT` を実際に作るためのプログラムを次に紹介しますね。

ファイル作成用サンプルプログラム (WRITE)

この `SHAIN.DAT` を作成するための簡単なCOBOLプログラム(WRITE文を使います)を紹介します。

このプログラムを実行すると、上の見本のような3件の社員データが書き込まれた `SHAIN.DAT` が出来上がります。

IDENTIFICATION DIVISION.
PROGRAM-ID. CREATE-SHAIN-FILE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SHAIN-FILE ASSIGN TO 'SHAIN.DAT'
           ORGANIZATION IS INDEXED
           ACCESS MODE IS SEQUENTIAL *> 最初は順番に書き込むのでSEQUENTIAL
           RECORD KEY IS SHAIN-BANGOU
           FILE STATUS IS FS-CODE.
DATA DIVISION.
FILE SECTION.
FD SHAIN-FILE.
01 SHAIN-RECORD.
   05 SHAIN-BANGOU   PIC X(4).
   05 SHAIN-NAME     PIC X(10). *> 日本語環境なら N(5) など調整
   05 SHAIN-AGE      PIC 9(2).
WORKING-STORAGE SECTION.
01 I                PIC 9(2) VALUE 1.  *> インデックス変数
01 FS-CODE          PIC X(2).
01 EOF-FLAG         PIC X(1) VALUE '0'. *> データ終了フラグ (このサンプルでは未使用)
01 SHAIN-DATA-TABLE. *> 書き込むデータ
   05 FILLER         PIC X(16) VALUE '0001TANAKA    25'.
   05 FILLER         PIC X(16) VALUE '0002SUZUKI    30'.
   05 FILLER         PIC X(16) VALUE '0003SATOU     28'.
01 SHAIN-DATA REDEFINES SHAIN-DATA-TABLE.
   05 SHAIN-TABLE OCCURS 3 TIMES. *> 3件分のデータ領域
      10 IN-SHAIN-BANGOU   PIC X(4).
      10 IN-SHAIN-NAME     PIC X(10).
      10 IN-SHAIN-AGE      PIC 9(2).

PROCEDURE DIVISION.
MAIN-PROC.
    *> ファイルを書き込みモードで開く (新規作成)
    OPEN OUTPUT SHAIN-FILE.

    *> ファイル状態コードをチェック (OPENエラー)
    IF FS-CODE NOT = '00' AND FS-CODE NOT = '97' *> '97'は一部環境での新規作成成功コード
       DISPLAY 'FILE OPEN ERROR: ' FS-CODE
       GO TO END-PROC
    END-IF.

    *> テーブルのデータを順番にファイルへ書き込む
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
        MOVE IN-SHAIN-BANGOU(I) TO SHAIN-BANGOU
        MOVE IN-SHAIN-NAME(I)  TO SHAIN-NAME
        MOVE IN-SHAIN-AGE(I)   TO SHAIN-AGE

        WRITE SHAIN-RECORD
            INVALID KEY *> 主キー重複など(今回はSEQUENTIALなので基本発生しないはず)
                DISPLAY 'WRITE ERROR (INVALID KEY): ' FS-CODE ' KEY=' SHAIN-BANGOU
                GO TO CLOSE-PROC
        END-WRITE

        *> ファイル状態コードをチェック (WRITEエラー)
        IF FS-CODE NOT = '00'
           DISPLAY 'WRITE ERROR: ' FS-CODE ' KEY=' SHAIN-BANGOU
           GO TO CLOSE-PROC
        END-IF
    END-PERFORM.

    DISPLAY 'SHAIN.DAT CREATED SUCCESSFULLY.'.

CLOSE-PROC.
    *> ファイルを閉じる
    CLOSE SHAIN-FILE.

END-PROC.
    STOP RUN.

ポイントは `OPEN OUTPUT` でファイルを開いている点です。

これにより、ファイルが存在しなければ新しく作成し、存在すれば上書きして、データを書き込みます。また、ACCESS MODE はデータを順番に書き込むだけなので `SEQUENTIAL` にしています。

ファイル作成プログラムの実行

上の `CREATE-SHAIN-FILE` プログラムを、お使いのCOBOL環境でコンパイルして実行してください。

エラーなく実行が完了すれば、プログラムを実行した場所に `SHAIN.DAT` というファイルが作成されているはずです。(環境によってはファイルの場所が異なる場合もあります)

これで、先ほど見本で示したような内容の `SHAIN.DAT` が手元に用意できました。DELETE文を試す準備は万端です!

サンプルプログラム (DELETE)

準備ができたところで、いよいよDELETE文を使ったプログラムを見ていきましょう。

先ほど作成した `SHAIN.DAT` から、社員番号 '0002' のレコードを削除するサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. DELETE-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SHAIN-FILE ASSIGN TO 'SHAIN.DAT'
           ORGANIZATION IS INDEXED
           ACCESS MODE IS RANDOM *> キーでアクセスするのでRANDOM
           RECORD KEY IS SHAIN-BANGOU
           FILE STATUS IS FS-CODE.
DATA DIVISION.
FILE SECTION.
FD SHAIN-FILE.
01 SHAIN-RECORD.
   05 SHAIN-BANGOU   PIC X(4).
   05 SHAIN-NAME     PIC X(10).
   05 SHAIN-AGE      PIC 9(2).
WORKING-STORAGE SECTION.
01 FS-CODE          PIC X(2).
01 DELETE-KEY       PIC X(4) VALUE '0002'. *> 削除したい社員番号

PROCEDURE DIVISION.
MAIN-PROC.
    *> ファイルを読み書き両用で開く
    OPEN I-O SHAIN-FILE.

    *> ファイル状態コードをチェック (OPENエラー)
    IF FS-CODE NOT = '00'
       DISPLAY 'FILE OPEN ERROR: ' FS-CODE
       GO TO END-PROC
    END-IF.

    *> 削除対象レコードのキーをセット
    MOVE DELETE-KEY TO SHAIN-BANGOU.

    *> 削除対象レコードを読み込む (存在確認のため)
    READ SHAIN-FILE
        INVALID KEY
            DISPLAY 'DELETE TARGET NOT FOUND. KEY=' SHAIN-BANGOU
            GO TO CLOSE-PROC
        NOT INVALID KEY
            *> レコードが見つかったら削除実行! ★ここがDELETE文★
            DELETE SHAIN-FILE RECORD

            *> ファイル状態コードをチェック (DELETEエラー)
            IF FS-CODE = '00'
               DISPLAY 'DELETE SUCCESS. KEY=' SHAIN-BANGOU
            ELSE
               DISPLAY 'DELETE ERROR: ' FS-CODE
            END-IF
    END-READ.

CLOSE-PROC.
    *> ファイルを閉じる
    CLOSE SHAIN-FILE.

END-PROC.
    STOP RUN.

サンプルプログラム (DELETE)の解説

このDELETE用プログラムのポイントを見ていきましょう。ファイル作成プログラムとの違いに注目です。

  • ENVIRONMENT DIVISION
    • `ACCESS MODE IS RANDOM` になっています。これは、社員番号(キー)を指定して特定のレコードに直接アクセスするためです。DELETE文で特定のレコードを消す場合は、このようにキーアクセスできるモード(RANDOM または DYNAMIC)にします。
    • それ以外の `SELECT`句の内容(ファイル名、編成、キー、状態コード)はファイル作成時と同じですね。同じファイルを使うので、定義は合わせる必要があります。

  • DATA DIVISION
    • `FD`宣言もファイル作成時と同じです。ファイルのレコード構造は変わりませんからね。
    • `WORKING-STORAGE SECTION` で、削除したいキー `DELETE-KEY` ('0002') を用意しています。

  • PROCEDURE DIVISION
    • `OPEN I-O SHAIN-FILE.` でファイルを開いています。DELETE文を使う際は、読み書き両用モード (`I-O`) で開くのが基本ルールです。
    • `MOVE DELETE-KEY TO SHAIN-BANGOU.` で、削除したいキーをレコードのキー項目にセット。
    • `READ SHAIN-FILE ...` で、まず削除したいレコードを読み込みます。DELETEの前にREADが必要、でしたね! これで削除対象が特定されます。
    • `INVALID KEY` は、指定したキーのレコードが見つからなかった場合の処理。
    • `NOT INVALID KEY` (レコードが見つかった場合)の中で、ついに `DELETE SHAIN-FILE RECORD` を実行! これでREADしたレコードが削除されます。
    • DELETE実行後、`IF FS-CODE = '00'` でファイル状態コードをチェック。成功か失敗かを確認しています。
    • 最後に `CLOSE SHAIN-FILE.` でファイルを閉じます。

ファイルの準備さえできていれば、DELETE処理の流れ自体はシンプルに感じませんか? READしてDELETE、そしてエラーチェック、この流れを掴むのがコツです。

サンプルプログラム (DELETE)の実行結果

では、この `DELETE-SAMPLE` プログラムをコンパイルして実行してみましょう。
実行前の `SHAIN.DAT` は、作成プログラムで作ったとおり、こうなっているはずです。

--- SHAIN.DAT (実行前) ---
0001TANAKA    25
0002SUZUKI    30  <-- これを削除!
0003SATOU     28

プログラムを実行すると、コンソールにはこんなメッセージが表示されるはずです。

DELETE SUCCESS. KEY=0002

そして、プログラム実行後の `SHAIN.DAT` ファイルの中身を(もし確認できれば)見てみると…

--- SHAIN.DAT (実行後) ---
0001TANAKA    25
0003SATOU     28

社員番号 '0002' の SUZUKI さんのレコードがきれいに削除されましたね! これでDELETE文の基本的な使い方が確認できました。

COBOL DELETE文を使う上での注意点

DELETE文は便利ですが、いくつか気をつけておかないと、思わぬエラーに見舞われることがあります。

ここでは、特に初心者がハマりがちなポイントを3つ、改めて確認しましょう。転ばぬ先の杖、ですよ!

ファイルの種類とOPENモード

まず、DELETE文が使えるファイルの種類は限られています。

基本的に、索引編成ファイル(INDEXED)や相対編成ファイル(RELATIVE)で使います。 これらのファイルは、レコードを特定のキーや番号で管理しているため、削除対象を特定しやすいのです。

そして、これらのファイルをDELETE文で使う場合、ファイルを開くときのモードは `OPEN I-O` (読み書き両用モード)にする必要があります。 `OPEN INPUT`(読み込み専用)や `OPEN OUTPUT`(書き込み専用)モードでは、DELETE文は使えません。もし間違ったモードで開いてDELETEしようとすると、エラーになってしまいます。

順編成ファイル(SEQUENTIAL)では、基本的にDELETE文は使えません(ファイルをまるごと作り直すのが一般的です)。使うファイルの種類とOPENモードの組み合わせは、しっかり確認しましょう。

事前にREAD文が必要

これも大事なルールです。

DELETE文は、必ずその直前に、削除したいレコードを `READ` 文で読み込んでおく必要があります。

なぜかというと、COBOLのDELETE文は「今、ファイルシステムが指し示しているレコード(カレントレコードポインタ、なんて言ったりします)を削除する」という動きをするからです。そして、その「指し示す」操作をするのがREAD文の役割なのです。

いきなり `DELETE ファイル名 RECORD` と書いても、「え?どのレコードを消せばいいの?」とCOBOLコンパイラ(翻訳機)や実行システムが困ってしまい、エラーになります。

「消す前に、まず読む!」 これを合言葉にしましょう。削除対象のレコードを特定するために、READは必須の手順なのです。

FILE STATUS句でのエラーチェック

DELETE文を実行したら、「はい、おしまい!」ではありません。

本当にちゃんと削除できたのか、何か問題は起きなかったのかを確認する習慣をつけましょう。

そのために使うのが、`ENVIRONMENT DIVISION` の `SELECT`句で指定した `FILE STATUS`句の変数(サンプルでは `FS-CODE`)です。

DELETE文を実行した後、この変数の中に処理結果を示すコードが入ります。

  • '00' : 正常終了! 問題なく削除できました。
  • '23' : レコードが見つからない。READ文で指定したキーのレコードが存在しなかった、などの場合にDELETEしようとすると起こることがあります。(DELETE前のREADのINVALID KEYで検知すべきですね)
  • その他のコード : ファイルが開かれていない、I-Oエラーが発生した、ディスクがいっぱい、など様々な原因が考えられます。

DELETE文を実行した直後には、必ずこのファイル状態コードをチェックして、'00' 以外のコードが返ってきたら、何らかのエラー処理を行うようにプログラムを組むのが、安定したシステムを作るコツです。

エラーを無視していると、データがおかしくなったり、後で大きな問題になったりする可能性がありますからね。しっかり確認しましょう!


【まとめ】COBOLの「DELETE文」を理解して活用しよう!

今回は、COBOLのファイル操作の中でも「削除」を担当するDELETE文について、準備から実行、注意点まで見てきました。

ポイントを振り返ってみましょう。

  • DELETE文は、ファイルから不要なレコードを削除する命令。
  • 基本的な書き方は `DELETE ファイル名 RECORD`。
  • 索引編成ファイルや相対編成ファイルで、`OPEN I-O` モードで使うのが基本。
  • DELETEを試す前に、WRITE文などでテスト用ファイルを作成しておく。
  • DELETEする前には、必ず `READ` 文で削除対象レコードを読み込む必要がある。
  • 実行後は `FILE STATUS`句でエラーチェックを忘れずに!

DELETE文は、使い方さえしっかり守れば、ファイルメンテナンスにおいてとても役立つ命令です。

最初はファイルの準備が少し手間に感じるかもしれませんが、一度流れを掴めば大丈夫。
サンプルコードを動かしてみたり、注意点を意識したりしながら、ぜひDELETE文と仲良くなってください。

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ