Cobol-file-handling-verbs
COBOL-ファイル処理動詞
ファイル処理動詞は、ファイルに対してさまざまな操作を実行するために使用されます。 以下は、ファイル処理動詞です-
- Open
- Read
- 書きます
- リライト
- 削除する
- 開始 *閉じる
動詞を開く
オープンは、実行する必要がある最初のファイル操作です。 Openが成功した場合、ファイルに対してそれ以降の操作のみが可能です。 ファイルを開いた後にのみ、ファイル構造内の変数を処理に使用できます。* FILE STATUS *変数は、各ファイル操作の後に更新されます。
構文
OPEN "mode" file-name.
ここで、file-nameは文字列リテラルであり、ファイルに名前を付けるために使用します。 ファイルは、次のモードで開くことができます-
Sr.No. | Mode & Description |
---|---|
1 |
Input 入力モードは既存のファイルに使用されます。 このモードでは、ファイルの読み取りのみが可能で、ファイルに対する他の操作は許可されていません。 |
2 |
Output 出力モードは、ファイルにレコードを挿入するために使用されます。 *順次ファイル*が使用され、ファイルがいくつかのレコードを保持している場合、既存のレコードが最初に削除されてから、新しいレコードがファイルに挿入されます。 *インデックス付きファイル*または*相対ファイル*の場合は発生しません。 |
3 |
Extend 拡張モードは、 sequential file にレコードを追加するために使用されます。 このモードでは、レコードは最後に挿入されます。 ファイルアクセスモードが*ランダム*または*ダイナミック*の場合、拡張モードは使用できません。 |
4 |
I-O 入出力モードは、ファイルのレコードを読み書きするために使用されます。 |
動詞を読む
読み取り動詞は、ファイルレコードを読み取るために使用されます。 読み取りの機能は、ファイルからレコードを取得することです。 読み取り動詞ごとに、ファイル構造に読み取れるレコードは1つだけです。 読み取り操作を実行するには、ファイルをINPUTモードまたはI-Oモードで開きます。 読み取りステートメントごとに、ファイルポインターがインクリメントされるため、連続するレコードが読み取られます。
構文
以下は、ファイルアクセスモードがシーケンシャルの場合にレコードを読み取る構文です-
READ file-name NEXT RECORD INTO ws-file-structure
AT END DISPLAY 'End of File'
NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.
以下は、使用されるパラメータです-
- NEXT RECORDはオプションであり、インデックス付きシーケンシャルファイルがシーケンシャルに読み取られるときに指定されます。
- INTO句はオプションです。 ws-file-structureはWorkingStorageセクションで定義され、READステートメントから値を取得します。
- AT END条件は、ファイルの終わりに達するとTrueになります。
例-次の例は、行順編成を使用して既存のファイルを読み取ります。 このプログラムは、ファイルに存在するすべてのレコードを表示する Live Demo オプションを使用してコンパイルおよび実行できます。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO 'input.txt'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
01 WS-EOF PIC A(1).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
PERFORM UNTIL WS-EOF='Y'
READ STUDENT INTO WS-STUDENT
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-STUDENT
END-READ
END-PERFORM.
CLOSE STUDENT.
STOP RUN.
*input.txt* ファイルで利用可能な入力ファイルのデータには次のものが含まれていると仮定します-
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan
構文
以下は、ファイルアクセスモードがランダムな場合にレコードを読み取る構文です-
READ file-name RECORD INTO ws-file-structure
KEY IS rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.
例-次の例では、インデックス化された組織を使用して既存のファイルを読み取ります。 このプログラムは、メインフレームで JCL を使用してコンパイルおよび実行でき、ファイルに存在するすべてのレコードが表示されます。 Mainframesサーバーでは、テキストファイルは使用しません。代わりに、PSファイルを使用します。
メインフレームに存在するファイルの内容が上記の例のinput.txtファイルと同じであると仮定しましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
MOVE 20005 TO STUDENT-ID.
READ STUDENT RECORD INTO WS-STUDENT-FILE
KEY IS STUDENT-ID
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY WS-STUDENT-FILE
END-READ.
CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
20005 Amitabh Bachhan
動詞を書く
書き込み動詞は、ファイルにレコードを挿入するために使用されます。 レコードが書き込まれると、レコードバッファで使用できなくなります。 レコードをファイルに挿入する前に、値をレコードバッファーに移動してから、書き込み動詞を実行します。
Writeステートメントを FROM オプションとともに使用して、作業用ストレージ変数からレコードを直接書き込むことができます。 Fromはオプションの句です。 アクセスモードがシーケンシャルの場合、レコードを書き込むには、ファイルを出力モードまたは拡張モードで開く必要があります。 アクセスモードがランダムまたはダイナミックの場合、レコードを書き込むには、ファイルを出力モードまたはI-Oモードで開く必要があります。
構文
以下は、ファイル編成がシーケンシャルであるときにレコードを読み取るための構文です-
WRITE record-buffer [FROM ws-file-structure]
END-WRITE.
以下は、ファイル編成がインデックス付けされているか、相対であるときにレコードを読み取るための構文です-
WRITE record-buffer [FROM ws-file-structure]
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.
例-次の例は、組織がシーケンシャルであるときに新しいファイルに新しいレコードを挿入する方法を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN EXTEND STUDENT.
MOVE 1000 TO STUDENT-ID.
MOVE 'Tim' TO NAME.
MOVE '10' TO CLASS.
WRITE STUDENT-FILE
END-WRITE.
CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)
上記のプログラムをコンパイルして実行すると、新しいレコードが出力ファイルに追加されます。
1000 Tim 10
動詞を書き換える
Rewrite verbは、レコードを更新するために使用されます。 書き換え操作を行うには、ファイルをI-Oモードで開く必要があります。 読み取り操作が成功した後にのみ使用できます。 Rewrite verbは、最後に読み取られたレコードを上書きします。
構文
以下は、ファイル編成がシーケンシャルであるときにレコードを読み取るための構文です-
REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.
以下は、ファイル編成がインデックス付けされているか、相対であるときにレコードを読み取るための構文です-
REWRITE record-buffer [FROM ws-file-structure]
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.
例-次の例は、前の書き込みステップで挿入した既存のレコードを更新する方法を示しています-
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.
READ STUDENT
KEY IS STUDENT-ID
INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
END-READ.
MOVE 'Tim Dumais' TO NAME.
REWRITE STUDENT-FILE
END-REWRITE.
CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
上記のプログラムをコンパイルして実行すると、レコードが更新されます-
1000 Tim Dumais 10
動詞を削除
削除動詞は、インデックス付きファイルおよび相対ファイルでのみ実行できます。 ファイルはI-Oモードで開く必要があります。 順次ファイル編成では、レコードを削除できません。 順次アクセスモードの場合、Readステートメントによって最後に読み取られたレコードは削除されます。 ランダムアクセスモードでは、レコードキーを指定してから、削除操作を実行します。
構文
以下は、レコードを削除するための構文です-
DELETE file-name RECORD
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.
例-既存のレコードを削除するには-
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.
DELETE STUDENT RECORD
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.
CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
上記のプログラムをコンパイルして実行すると、次の結果が生成されます-
Record Deleted
動詞を開始
開始動詞は、インデックス付きファイルおよび相対ファイルでのみ実行できます。 特定のレコードにファイルポインターを配置するために使用されます。 アクセスモードは、シーケンシャルモードまたはダイナミックモードでなければなりません。 ファイルはI-Oまたは入力モードで開く必要があります。
構文
以下は、特定のレコードにポインタを配置するための構文です-
START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.
動詞を閉じる
ファイルを閉じるには、閉じる動詞が使用されます。 Close操作を実行した後、ファイル構造内の変数は処理に使用できなくなります。 プログラムとファイル間のリンクは失われます。
構文
以下は、ファイルを閉じるための構文です-
CLOSE file-name.