- COBOL 教程
- COBOL - 首頁
- COBOL - 概述
- COBOL - 環境設定
- COBOL - 程式結構
- COBOL - 基本語法
- COBOL - 資料型別
- COBOL - 基本動詞
- COBOL - 資料佈局
- COBOL - 條件語句
- COBOL - 迴圈語句
- COBOL - 字串處理
- COBOL - 表處理
- COBOL - 檔案處理
- COBOL - 檔案組織
- COBOL - 檔案訪問模式
- COBOL - 檔案處理動詞
- COBOL - 子程式
- COBOL - 內部排序
- COBOL - 資料庫介面
- COBOL 有用資源
- COBOL - 問答
- COBOL - 快速指南
- COBOL - 有用資源
COBOL - 檔案處理動詞
檔案處理動詞用於對檔案執行各種操作。以下是檔案處理動詞:
- 開啟 (Open)
- 讀取 (Read)
- 寫入 (Write)
- 改寫 (Rewrite)
- 刪除 (Delete)
- 開始 (Start)
- 關閉 (Close)
Open 動詞
Open 是必須執行的第一個檔案操作。如果 Open 成功,則只有後續操作才能在檔案上進行。只有在開啟檔案後,檔案結構中的變數才能用於處理。檔案狀態 (FILE STATUS) 變數在每次檔案操作後都會更新。
語法
OPEN "mode" file-name.
這裡,檔名是字串文字,您將使用它來命名您的檔案。檔案可以以下列模式開啟:
| 序號 | 模式及說明 |
|---|---|
| 1 |
輸入 (Input) 輸入模式用於現有檔案。在此模式下,我們只能讀取檔案,不允許對檔案進行其他操作。 |
| 2 |
輸出 (Output) 輸出模式用於在檔案中插入記錄。如果使用順序檔案並且檔案包含一些記錄,則將首先刪除現有記錄,然後將新記錄插入檔案中。對於索引檔案或相對檔案,則不會發生這種情況。 |
| 3 |
擴充套件 (Extend) 擴充套件模式用於在順序檔案中追加記錄。在此模式下,記錄將插入到末尾。如果檔案訪問模式為隨機 (Random) 或動態 (Dynamic),則不能使用擴充套件模式。 |
| 4 |
I-O 輸入輸出模式用於讀取和改寫檔案的記錄。 |
Read 動詞
Read 動詞用於讀取檔案記錄。Read 的功能是從檔案中獲取記錄。在每個 Read 動詞中,只能將一條記錄讀入檔案結構。要執行讀取操作,請以 INPUT 或 I-O 模式開啟檔案。在每個 Read 語句中,檔案指標都會遞增,因此會讀取連續的記錄。
語法
以下是當檔案訪問模式為順序時讀取記錄的語法:
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。
示例 - 下面的示例使用行順序組織讀取現有檔案。此程式可以使用線上演示選項編譯和執行,它將顯示檔案中存在的所有記錄。
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編譯和執行,它將顯示檔案中存在的所有記錄。在大型機伺服器上,我們不使用文字檔案;而是使用 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.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR
編譯並執行上述程式後,將產生以下結果:
20005 Amitabh Bachhan
Write 動詞
Write 動詞用於在檔案中插入記錄。寫入記錄後,它將不再在記錄緩衝區中可用。在將記錄插入檔案之前,請將值移動到記錄緩衝區,然後執行 Write 動詞。
Write 語句可以與FROM選項一起使用,以直接從工作儲存變數寫入記錄。From 是一個可選子句。如果訪問模式是順序的,則要寫入記錄,檔案必須以 Output 模式或 Extend 模式開啟。如果訪問模式是隨機的或動態的,則要寫入記錄,檔案必須以 Output 模式或 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.
執行上述 COBOL 程式的JCL:
//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 動詞
Rewrite 動詞用於更新記錄。對於改寫操作,檔案應以 I-O 模式開啟。它只能在成功執行 Read 操作後使用。Rewrite 動詞會覆蓋最後讀取的記錄。
語法
以下是當檔案組織為順序時讀取記錄的語法:
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.
示例 - 下面的示例顯示如何更新我們在之前的 Write 步驟中插入的現有記錄:
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.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
編譯並執行上述程式後,它將更新記錄:
1000 Tim Dumais 10
Delete 動詞
Delete 動詞只能對索引檔案和相對檔案執行。檔案必須以 I-O 模式開啟。在順序檔案組織中,不能刪除記錄。在順序訪問模式下,將刪除 Read 語句最後讀取的記錄。在隨機訪問模式下,請指定記錄鍵,然後執行 Delete 操作。
語法
以下是刪除記錄的語法:
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.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
編譯並執行上述程式後,將產生以下結果:
Record Deleted
Start 動詞
Start 動詞只能對索引檔案和相對檔案執行。它用於將檔案指標放在特定記錄處。訪問模式必須是順序的或動態的。檔案必須以 I-O 或 Input 模式開啟。
語法
以下是將指標放在特定記錄處的語法:
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 動詞用於關閉檔案。執行 Close 操作後,檔案結構中的變數將不可用於處理。程式和檔案之間的連結將丟失。
語法
以下是關閉檔案的語法:
CLOSE file-name.
