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.
廣告
© . All rights reserved.