「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文と仲良くなってください。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。