- 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 - 快速指南
COBOL - 概述
COBOL 簡介
COBOL 是一種高階語言。必須瞭解 COBOL 的工作方式。計算機只理解機器程式碼,即 0 和 1 的二進位制流。COBOL 程式碼必須使用編譯器轉換為機器程式碼。將程式原始碼透過編譯器執行。編譯器首先檢查是否存在任何語法錯誤,然後將其轉換為機器語言。編譯器建立一個輸出檔案,稱為載入模組。此輸出檔案包含以 0 和 1 形式表示的可執行程式碼。
COBOL 的演變
在 20 世紀 50 年代,當世界西部的企業發展壯大時,需要自動化各種流程以簡化操作,這催生了一種面向業務資料處理的高階程式語言。
1959 年,COBOL 由 CODASYL(資料系統語言會議)開發。
下一個版本 COBOL-61 於 1961 年釋出,並進行了一些修訂。
1968 年,COBOL 被 ANSI 批准為商業用途的標準語言(COBOL-68)。
它分別於 1974 年和 1985 年進行了修訂,以開發名為 COBOL-74 和 COBOL-85 的後續版本。
2002 年,釋出了面向物件的 COBOL,它可以將封裝物件作為 COBOL 程式設計的常規部分使用。
COBOL 的重要性
COBOL 是第一種廣泛使用的高階程式語言。它是一種類似英語的語言,使用者友好。所有指令都可以用簡單的英語單詞進行編碼。
COBOL 也用作自文件語言。
COBOL 可以處理海量資料處理。
COBOL 與其以前的版本相容。
COBOL 具有有效的錯誤訊息,因此,錯誤的解決更加容易。
COBOL 的特點
標準語言
COBOL 是一種標準語言,可以在 IBM AS/400、個人電腦等機器上編譯和執行。
面向業務
COBOL 旨在用於與金融領域、國防領域等相關的面向業務的應用程式。由於其高階檔案處理功能,它可以處理海量資料。
健壯的語言
COBOL 是一種健壯的語言,因為它幾乎在所有計算機平臺上都提供了大量的除錯和測試工具。
結構化語言
COBOL 中提供了邏輯控制結構,這使得它更容易閱讀和修改。COBOL 具有不同的部分,因此易於除錯。
COBOL - 環境設定
我們已線上設定了 COBOL 程式設計環境,以便您可以線上編譯和執行所有可用的示例。它讓您對正在閱讀的內容充滿信心,並使您能夠使用不同的選項驗證程式。隨時修改任何示例並在網上執行。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. DISPLAY 'Hello World'. STOP RUN.
對於本教程中給出的大多數示例,您都可以在我們網站程式碼部分的右上角找到“試一試”選項,該選項將帶您進入線上編譯器。因此,只需使用它並享受您的學習。
在 Windows/Linux 上安裝 COBOL
有許多可用於 Windows 的免費大型機模擬器,可用於編寫和學習簡單的 COBOL 程式。
其中一個模擬器是 Hercules,它可以透過以下幾個簡單的步驟輕鬆安裝在 Windows 上:
下載並安裝 Hercules 模擬器,該模擬器可從 Hercules 主頁獲得:www.hercules-390.eu
在 Windows 機器上安裝軟體包後,它將建立一個類似於C:/hercules/mvs/cobol的資料夾。
執行命令提示符 (CMD) 並轉到 CMD 上的 C:/hercules/mvs/cobol 目錄。
有關編寫和執行 JCL 和 COBOL 程式的各種命令的完整指南可在以下網址找到:
www.jaymoseley.com/hercules/installmvs/instmvs2.htm
Hercules 是大型機 System/370 和 ESA/390 架構以及最新的 64 位 z/Architecture 的開源軟體實現。Hercules 在 Linux、Windows、Solaris、FreeBSD 和 Mac OS X 上執行。
使用者可以透過多種方式連線到大型機伺服器,例如瘦客戶端、虛擬終端、虛擬客戶端系統 (VCS) 或虛擬桌面系統 (VDS)。每個有效使用者都會獲得一個登入 ID 以進入 Z/OS 介面(TSO/E 或 ISPF)。
編譯 COBOL 程式
為了使用 JCL 以批處理模式執行 COBOL 程式,需要編譯程式,並建立一個包含所有子程式的載入模組。JCL 在執行時使用載入模組,而不是實際程式。載入庫被連線起來,並在執行時使用JCLLIB或STEPLIB傳遞給 JCL。
有許多大型機編譯器實用程式可用於編譯 COBOL 程式。一些公司使用 Change Management 工具(如Endevor),它可以編譯並存儲程式的每個版本。這有助於跟蹤對程式所做的更改。
//COMPILE JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID //* //STEP1 EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE //SYSIN DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR //SYSLIB DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR //SYSLMOD DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR //SYSPRINT DD SYSOUT=* //*
IGYCRCTL 是一個 IBM COBOL 編譯器實用程式。編譯器選項透過 PARM 引數傳遞。在上面的示例中,RMODE 指示編譯器在程式中使用相對定址模式。COBOL 程式透過 SYSIN 引數傳遞。Copybook 是 SYSLIB 中程式使用的庫。
執行 COBOL 程式
下面是一個 JCL 示例,其中程式 MYPROG 使用輸入檔案 MYDATA.URMI.INPUT 執行,並生成兩個寫入卷軸的輸出檔案。
//COBBSTEP JOB CLASS=6,NOTIFY=&SYSUID // //STEP10 EXEC PGM=MYPROG,PARM=ACCT5000 //STEPLIB DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR //INPUT1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR //OUT1 DD SYSOUT=* //OUT2 DD SYSOUT=* //SYSIN DD * //CUST1 1000 //CUST2 1001 /*
MYPROG 的載入模組位於 MYDATA.URMI.LOADLIB 中。需要注意的是,上述 JCL 只能用於非 DB2 COBOL 模組。
執行 COBOL-DB2 程式
為了執行 COBOL-DB2 程式,JCL 和程式中使用了專門的 IBM 實用程式;DB2 區域和所需引數作為輸入傳遞給實用程式。
執行 COBOL-DB2 程式的步驟如下:
當編譯 COBOL-DB2 程式時,除了載入模組外,還會建立一個 DBRM(資料庫請求模組)。DBRM 包含 COBOL 程式的 SQL 語句,並對其語法進行了檢查以確保正確。
DBRM 繫結到 COBOL 將在其上執行的 DB2 區域(環境)。這可以透過 JCL 中的 IKJEFT01 實用程式完成。
繫結步驟完成後,使用 IKJEFT01(再次)執行 COBOL-DB2 程式,並將載入庫和 DBRM 庫作為輸入傳遞給 JCL。
//STEP001 EXEC PGM=IKJEFT01
//*
//STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
LIB('MYDATA.URMI.LOADLIB')
END
/*
在上面的示例中,MYCOBB 是使用 IKJEFT01 執行的 COBOL-DB2 程式。請注意,程式名稱、DB2 子系統 ID(SSID)和 DB2 計劃名稱在 SYSTSIN DD 語句中傳遞。DBRM 庫在 STEPLIB 中指定。
COBOL - 程式結構
COBOL 程式結構由以下影像所示的部分組成:
下面簡要介紹了這些部分:
節是程式邏輯的邏輯細分。節是段落的集合。
段落是節或部分的細分。它是一個後跟句點的使用者定義或預定義名稱,包含零個或多個句子/條目。
句子是一個或多個語句的組合。句子僅出現在過程部分。句子必須以句點結尾。
語句是執行某些處理的有意義的 COBOL 語句。
字元在層次結構中最低,並且不可分割。
您可以將上述術語與以下示例中的 COBOL 程式關聯:
PROCEDURE DIVISION. A0000-FIRST-PARA SECTION. FIRST-PARAGRAPH. ACCEPT WS-ID - Statement-1 -----| MOVE '10' TO WS-ID - Statement-2 |-- Sentence - 1 DISPLAY WS-ID - Statement-3 -----| .
部分
COBOL 程式由四個部分組成。
標識部分
它是每個 COBOL 程式的第一個也是唯一一個必須有的部分。程式設計師和編譯器使用此部分來識別程式。在此部分中,PROGRAM-ID 是唯一必須有的段落。PROGRAM-ID 指定程式名稱,程式名稱可以包含 1 到 30 個字元。
使用線上的即時演示選項試用以下示例。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. DISPLAY 'Welcome to Tutorialspoint'. STOP RUN.
以下是執行上述 COBOL 程式的JCL。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Welcome to Tutorialspoint
環境部分
環境部分用於向程式指定輸入和輸出檔案。它包含兩個節:
配置節提供有關編寫和執行程式的系統的資訊。它包含兩個段落:
源計算機 - 用於編譯程式的系統。
目標計算機 - 用於執行程式的系統。
輸入輸出節提供有關程式中要使用的檔案的資訊。它包含兩個段落:
檔案控制 - 提供程式中使用的外部資料集的資訊。
I-O 控制 - 提供程式中使用的檔案的資訊。
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. XXX-ZOS. OBJECT-COMPUTER. XXX-ZOS. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILEN ASSIGN TO DDNAME ORGANIZATION IS SEQUENTIAL.
資料部分
資料部分用於定義程式中使用的變數。它包含四個節:
檔案節用於定義檔案的記錄結構。
工作儲存節用於宣告程式中使用的臨時變數和檔案結構。
本地儲存節類似於工作儲存節。唯一的區別是,每次程式開始執行時都會分配和初始化變數。
連線節用於描述從外部程式接收的資料名稱。
COBOL 程式
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO INPUT.
ORGANIZATION IS SEQUENTIAL.
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILEN
01 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT PIC A(30).
01 WS-ID PIC 9(5).
LOCAL-STORAGE SECTION.
01 LS-CLASS PIC 9(3).
LINKAGE SECTION.
01 LS-ID PIC 9(5).
PROCEDURE DIVISION.
DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.
執行上述 COBOL 程式的JCL如下:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR
當您編譯並執行上述程式時,它會生成以下結果:
Executing COBOL program using JCL
過程部分
過程部分用於包含程式的邏輯。它使用資料部分中定義的變數包含可執行語句。在此部分中,段落和節名稱是使用者定義的。
過程部分中必須至少有一個語句。此部分中結束執行的最後一個語句要麼是STOP RUN(用於呼叫程式),要麼是EXIT PROGRAM(用於被呼叫程式)。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NAME PIC A(30). 01 WS-ID PIC 9(5) VALUE '12345'. PROCEDURE DIVISION. A000-FIRST-PARA. DISPLAY 'Hello World'. MOVE 'TutorialsPoint' TO WS-NAME. DISPLAY "My name is : "WS-NAME. DISPLAY "My ID is : "WS-ID. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Hello World My name is : TutorialsPoint My ID is : 12345
COBOL - 基本語法
字元集
“字元”在層次結構中最低,它們不能再細分。COBOL 字元集包括 78 個字元,如下所示:
| 序號 | 字元和描述 |
|---|---|
| 1 | A-Z 字母(大寫) |
| 2 | a-z 字母(小寫) |
| 3 | 0-9 數字 |
| 4 |
空格 |
| 5 | + 加號 |
| 6 | - 減號或連字元 |
| 7 | * 星號 |
| 8 | / 正斜槓 |
| 9 | $ 貨幣符號 |
| 10 | , 逗號 |
| 11 | ; 分號 |
| 12 |
. 小數點或句點 |
| 13 |
" 引號 |
| 14 |
( 左括號 |
| 15 |
) 右括號 |
| 16 |
> 大於 |
| 17 |
< 小於 |
| 18 |
: 冒號 |
| 19 |
' 撇號 |
| 20 |
= 等號 |
編碼表
COBOL 的源程式必須以編譯器可以接受的格式編寫。COBOL 程式寫在 COBOL 編碼表上。編碼表每一行的字元位置有 80 個。
字元位置被分成以下五個欄位:
| 位置 | 欄位 | 描述 |
|---|---|---|
| 1-6 | 列號 | 保留用於行號。 |
| 7 | 指示器 | 它可以使用星號 (*) 表示註釋,連字元 (-) 表示續行,以及斜槓 (/) 表示換頁。 |
| 8-11 | 區域 A | 所有 COBOL 部、節、段落和一些特殊條目都必須從區域 A 開始。 |
| 12-72 | 區域 B | 所有 COBOL 語句都必須從區域 B 開始。 |
| 73-80 | 標識區 | 程式設計師可以根據需要使用它。 |
示例
以下示例顯示了一個 COBOL 程式碼表 -
000100 IDENTIFICATION DIVISION. 000100 000200 PROGRAM-ID. HELLO. 000101 000250* THIS IS A COMMENT LINE 000102 000300 PROCEDURE DIVISION. 000103 000350 A000-FIRST-PARA. 000104 000400 DISPLAY “Coding Sheet”. 000105 000500 STOP RUN. 000106
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Coding Sheet
字元字串
字元字串是由單個字元組合而成的。字元字串可以是
- 註釋,
- 文字,或
- COBOL 字。
所有字元字串都必須以**分隔符**結尾。分隔符用於分隔字元字串。
常用分隔符 - 空格、逗號、句點、撇號、左/右括號和引號。
註釋
註釋是不會影響程式執行的字元字串。它可以是任何字元組合。
註釋有兩種型別 -
註釋行
註釋行可以寫在任何列中。編譯器不會檢查註釋行的語法,並將其視為文件。
註釋條目
註釋條目是指包含在 Identification Division 可選段落中的條目。它們寫在區域 B 中,程式設計師使用它進行參考。
以下示例中以**粗體**突出顯示的文字是註釋條目 -
000100 IDENTIFICATION DIVISION. 000100 000150 PROGRAM-ID. HELLO. 000101 000200 AUTHOR. TUTORIALSPOINT. 000102 000250* THIS IS A COMMENT LINE 000103 000300 PROCEDURE DIVISION. 000104 000350 A000-FIRST-PARA. 000105 000360/ First Para Begins - Documentation Purpose 000106 000400 DISPLAY “Comment line”. 000107 000500 STOP RUN. 000108
執行上述 COBOL 程式的**JCL** -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Comment Line
文字
文字是在程式中直接硬編碼的常量。在下面的示例中,“Hello World”是一個文字。
PROCEDURE DIVISION. DISPLAY 'Hello World'.
文字有兩種型別,如下所述 -
字母數字文字
字母數字文字用引號或撇號括起來。長度最多可達 160 個字元。撇號或引號只能作為文字的一部分,前提是它們成對出現。文字的開始和結束必須相同,要麼是撇號,要麼是引號。
示例
以下示例顯示了有效的和無效的字母數字文字 -
Valid: ‘This is valid’ "This is valid" ‘This isn’’t invalid’ Invalid: ‘This is invalid” ‘This isn’t valid’
數字文字
數字文字是 0 到 9 的數字、+、- 或小數點的組合。長度最多可達 18 個字元。符號不能是最後一個字元。小數點不能出現在末尾。
示例
以下示例顯示了有效的和無效的數字文字 -
Valid: 100 +10.9 -1.9 Invalid: 1,00 10. 10.9-
COBOL 字
COBOL 字是可以用作保留字或使用者定義字的字元字串。長度最多可達 30 個字元。
使用者定義
使用者定義的字用於命名檔案、資料、記錄、段落名和節。在形成使用者定義的字時,允許使用字母、數字和連字元。不能使用 COBOL 保留字。
保留字
保留字是 COBOL 中預定義的字。我們經常使用的不同型別的保留字如下 -
**關鍵字**,如 ADD、ACCEPT、MOVE 等。
**特殊字元**字,如 +、-、*、<、<= 等
**文字常量**是諸如 ZERO、SPACES 等的常量值。文字常量的所有常量值都在下表中列出。
文字常量
| 序號 | 文字常量和描述 |
|---|---|
| 1 |
HIGH-VALUES 一個或多個字元,這些字元在降序中將位於最高位置。 |
| 2 |
LOW-VALUES 一個或多個字元在二進位制表示中具有零。 |
| 3 |
ZERO/ZEROES 根據變數的大小,一個或多個零。 |
| 4 |
SPACES 一個或多個空格。 |
| 5 |
QUOTES 單引號或雙引號。 |
| 6 |
ALL 文字 用文字填充資料項。 |
COBOL - 資料型別
Data Division 用於定義程式中使用的變數。要描述 COBOL 中的資料,必須理解以下術語 -
- 資料名
- 級別號
- Picture 子句
- Value 子句
01 TOTAL-STUDENTS PIC9(5) VALUE '125'. | | | | | | | | | | | | Level Number Data Name Picture Clause Value Clause
資料名
在 Procedure Division 中使用資料名前,必須在 Data Division 中定義它們。它們必須具有使用者定義的名稱;不能使用保留字。資料名稱引用儲存實際資料的記憶體位置。它們可以是基本型別或組型別。
示例
以下示例顯示了有效和無效的資料名稱 -
Valid: WS-NAME TOTAL-STUDENTS A100 100B Invalid: MOVE (Reserved Words) COMPUTE (Reserved Words) 100 (No Alphabet) 100+B (+ is not allowed)
級別號
級別號用於指定記錄中資料的級別。它們用於區分基本項和組項。基本項可以組合在一起以建立組項。
| 序號 | 級別號和描述 |
|---|---|
| 1 |
01 記錄描述條目 |
| 2 |
02 到 49 組和基本項 |
| 3 |
66 重新命名子句項 |
| 4 |
77 無法細分的項 |
| 5 |
88 條件名稱條目 |
**基本項**不能進一步細分。級別號、資料名、Picture 子句和 Value 子句(可選)用於描述基本項。
**組項**由一個或多個基本項組成。級別號、資料名和 Value 子句(可選)用於描述組項。組級別號始終為 01。
示例
以下示例顯示了組和基本項 -
DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NAME PIC X(25). ---> ELEMENTARY ITEM 01 WS-CLASS PIC 9(2) VALUE '10'. ---> ELEMENTARY ITEM 01 WS-ADDRESS. ---> GROUP ITEM 05 WS-HOUSE-NUMBER PIC 9(3). ---> ELEMENTARY ITEM 05 WS-STREET PIC X(15). ---> ELEMENTARY ITEM 05 WS-CITY PIC X(15). ---> ELEMENTARY ITEM 05 WS-COUNTRY PIC X(15) VALUE 'INDIA'. ---> ELEMENTARY ITEM
Picture 子句
Picture 子句用於定義以下項 -
**資料型別**可以是數字、字母或字母數字。數字型別僅包含 0 到 9 的數字。字母型別包含 A 到 Z 的字母和空格。字母數字型別包含數字、字母和特殊字元。
**符號**可以與數字資料一起使用。它可以是 + 或 -。
**小數點位置**可以與數字資料一起使用。假定位置是小數點的位置,不包含在資料中。
**長度**定義資料項使用的位元組數。
Picture 子句中使用的符號 -
| 序號 | 符號和描述 |
|---|---|
| 1 |
9 數字 |
| 2 |
A 字母 |
| 3 |
X 字母數字 |
| 4 |
V 隱式小數 |
| 5 |
S 符號 |
| 6 |
P 假定小數 |
示例
以下示例顯示了 PIC 子句的使用 -
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC S9(3)V9(2). 01 WS-NUM2 PIC PPP999. 01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45. 01 WS-NAME PIC A(6) VALUE 'ABCDEF'. 01 WS-ID PIC X(5) VALUE 'A121$'. PROCEDURE DIVISION. DISPLAY "WS-NUM1 : "WS-NUM1. DISPLAY "WS-NUM2 : "WS-NUM2. DISPLAY "WS-NUM3 : "WS-NUM3. DISPLAY "WS-NAME : "WS-NAME. DISPLAY "WS-ID : "WS-ID. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : +000.00 WS-NUM2 : .000000 WS-NUM3 : -123.45 WS-NAME : ABCDEF WS-ID : A121$
Value 子句
Value 子句是一個可選子句,用於初始化資料項。值可以是數字文字、字母數字文字或文字常量。它可以與組項和基本項一起使用。
示例
以下示例顯示了 VALUE 子句的使用 -
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 99V9 VALUE IS 3.5. 01 WS-NAME PIC A(6) VALUE 'ABCD'. 01 WS-ID PIC 99 VALUE ZERO. PROCEDURE DIVISION. DISPLAY "WS-NUM1 : "WS-NUM1. DISPLAY "WS-NAME : "WS-NAME. DISPLAY "WS-ID : "WS-ID. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 03.5 WS-NAME : ABCD WS-ID : 00
COBOL - 基本動詞
COBOL 動詞在過程部分用於資料處理。語句始終以 COBOL 動詞開頭。有幾種 COBOL 動詞具有不同型別的操作。
輸入/輸出動詞
輸入/輸出動詞用於從使用者獲取資料並顯示 COBOL 程式的輸出。以下兩個動詞用於此過程 -
Accept 動詞
Accept 動詞用於從作業系統或直接從使用者獲取資料,例如日期、時間和日期。如果程式正在從使用者處接受資料,則需要透過 JCL 傳遞。在從作業系統獲取資料時,將包含 FROM 選項,如下例所示 -
ACCEPT WS-STUDENT-NAME. ACCEPT WS-DATE FROM SYSTEM-DATE.
Display 動詞
Display 動詞用於顯示 COBOL 程式的輸出。
DISPLAY WS-STUDENT-NAME. DISPLAY "System date is : " WS-DATE.
COBOL 程式
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STUDENT-NAME PIC X(25). 01 WS-DATE PIC X(10). PROCEDURE DIVISION. ACCEPT WS-STUDENT-NAME. ACCEPT WS-DATE FROM DATE. DISPLAY "Name : " WS-STUDENT-NAME. DISPLAY "Date : " WS-DATE. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR //SYSIN DD * TutorialsPoint /*
當您編譯並執行上述程式時,它會生成以下結果:
Name : TutorialsPoint Date : 2014-08-30
Initialize 動詞
Initialize 動詞用於初始化組項或基本項。具有 RENAME 子句的資料名稱不能初始化。數字資料項將替換為 ZEROES。字母數字或字母資料項將替換為 SPACES。如果我們包含 REPLACING 術語,則資料項可以初始化為給定的替換值,如下例所示 -
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NAME PIC A(30) VALUE 'ABCDEF'. 01 WS-ID PIC 9(5). 01 WS-ADDRESS. 05 WS-HOUSE-NUMBER PIC 9(3). 05 WS-COUNTRY PIC X(15). 05 WS-PINCODE PIC 9(6) VALUE 123456. PROCEDURE DIVISION. A000-FIRST-PARA. INITIALIZE WS-NAME, WS-ADDRESS. INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345. DISPLAY "My name is : "WS-NAME. DISPLAY "My ID is : "WS-ID. DISPLAY "Address : "WS-ADDRESS. DISPLAY "House Number : "WS-HOUSE-NUMBER. DISPLAY "Country : "WS-COUNTRY. DISPLAY "Pincode : "WS-PINCODE. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
My name is : My ID is : 12345 Address : 000 000000 House Number : 000 Country : Pincode : 000000
Move 動詞
Move 動詞用於將資料從源資料複製到目標資料。它可以用於基本資料項和組資料項。對於組資料項,使用 MOVE CORRESPONDING/CORR。在試用選項中,MOVE CORR 不起作用;但在大型機伺服器上,它將起作用。
要從字串移動資料,使用 MOVE(x:l),其中 x 是起始位置,l 是長度。如果目標資料項的 PIC 子句小於源資料項的 PIC 子句,則資料將被截斷。如果目標資料項的 PIC 子句大於源資料項的 PIC 子句,則將在額外的位元組中新增 ZEROS 或 SPACES。以下示例使這一點變得清晰。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9). 01 WS-NUM2 PIC 9(9). 01 WS-NUM3 PIC 9(5). 01 WS-NUM4 PIC 9(6). 01 WS-ADDRESS. 05 WS-HOUSE-NUMBER PIC 9(3). 05 WS-COUNTRY PIC X(5). 05 WS-PINCODE PIC 9(6). 01 WS-ADDRESS1. 05 WS-HOUSE-NUMBER1 PIC 9(3). 05 WS-COUNTRY1 PIC X(5). 05 WS-PINCODE1 PIC 9(6). PROCEDURE DIVISION. A000-FIRST-PARA. MOVE 123456789 TO WS-NUM1. MOVE WS-NUM1 TO WS-NUM2 WS-NUM3. MOVE WS-NUM1(3:6) TO WS-NUM4. MOVE 123 TO WS-HOUSE-NUMBER. MOVE 'INDIA' TO WS-COUNTRY. MOVE 112233 TO WS-PINCODE. MOVE WS-ADDRESS TO WS-ADDRESS1. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUM3 : " WS-NUM3 DISPLAY "WS-NUM4 : " WS-NUM4 DISPLAY "WS-ADDRESS : " WS-ADDRESS DISPLAY "WS-ADDRESS1 : " WS-ADDRESS1 STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 123456789 WS-NUM2 : 123456789 WS-NUM3 : 56789 WS-NUM4 : 345678 WS-ADDRESS : 123INDIA112233 WS-ADDRESS1 : 123INDIA112233
合法移動
下表提供有關合法移動的資訊 -
| 字母 | 字母數字 | 數字 | |
|---|---|---|---|
| 字母 | 可能的 | 可能的 | 不可能的 |
| 字母數字 | 可能的 | 可能的 | 可能的 |
| 數字 | 不可能的 | 可能的 | 可能的 |
Add 動詞
Add 動詞用於將兩個或多個數字相加並將結果儲存在目標運算元中。
語法
以下是將兩個或多個數字相加的語法 -
ADD A B TO C D ADD A B C TO D GIVING E ADD CORR WS-GROUP1 TO WS-GROUP2
在語法-1 中,將 A、B、C 相加並將結果儲存在 C 中 (C=A+B+C)。將 A、B、D 相加並將結果儲存在 D 中 (D = A + B + D)。
在語法-2 中,將 A、B、C、D 相加並將結果儲存在 E 中 (E=A+B+C+D)。
在語法-3 中,將 WS-GROUP1 和 WS-GROUP2 中的子組項相加並將結果儲存在 WS-GROUP2 中。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9) VALUE 10 . 01 WS-NUM2 PIC 9(9) VALUE 10. 01 WS-NUM3 PIC 9(9) VALUE 10. 01 WS-NUM4 PIC 9(9) VALUE 10. 01 WS-NUMA PIC 9(9) VALUE 10. 01 WS-NUMB PIC 9(9) VALUE 10. 01 WS-NUMC PIC 9(9) VALUE 10. 01 WS-NUMD PIC 9(9) VALUE 10. 01 WS-NUME PIC 9(9) VALUE 10. PROCEDURE DIVISION. ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4. ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUM3 : " WS-NUM3 DISPLAY "WS-NUM4 : " WS-NUM4 DISPLAY "WS-NUMA : " WS-NUMA DISPLAY "WS-NUMB : " WS-NUMB DISPLAY "WS-NUMC : " WS-NUMC DISPLAY "WS-NUMD : " WS-NUMD DISPLAY "WS-NUME : " WS-NUME STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 000000010 WS-NUM2 : 000000010 WS-NUM3 : 000000030 WS-NUM4 : 000000030 WS-NUMA : 000000010 WS-NUMB : 000000010 WS-NUMC : 000000010 WS-NUMD : 000000010 WS-NUME : 000000040
Subtract 動詞
Subtract 動詞用於減法運算。
語法
以下是 Subtract 運算的語法 -
SUBTRACT A B FROM C D SUBTRACT A B C FROM D GIVING E SUBTRACT CORR WS-GROUP1 TO WS-GROUP2
在語法-1 中,將 A 和 B 相加並從 C 中減去。結果儲存在 C 中 (C = C-(A+B))。將 A 和 B 相加並從 D 中減去。結果儲存在 D 中 (D = D-(A+B))。
在語法-2 中,將 A、B、C 相加並從 D 中減去。結果儲存在 E 中 (E = D-(A+B+C))
在語法-3 中,將 WS-GROUP1 和 WS-GROUP2 中的子組項相減並將結果儲存在 WS-GROUP2 中。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9) VALUE 10 . 01 WS-NUM2 PIC 9(9) VALUE 10. 01 WS-NUM3 PIC 9(9) VALUE 100. 01 WS-NUM4 PIC 9(9) VALUE 100. 01 WS-NUMA PIC 9(9) VALUE 10. 01 WS-NUMB PIC 9(9) VALUE 10. 01 WS-NUMC PIC 9(9) VALUE 10. 01 WS-NUMD PIC 9(9) VALUE 100. 01 WS-NUME PIC 9(9) VALUE 10. PROCEDURE DIVISION. SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4. SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUM3 : " WS-NUM3 DISPLAY "WS-NUM4 : " WS-NUM4 DISPLAY "WS-NUMA : " WS-NUMA DISPLAY "WS-NUMB : " WS-NUMB DISPLAY "WS-NUMC : " WS-NUMC DISPLAY "WS-NUMD : " WS-NUMD DISPLAY "WS-NUME : " WS-NUME STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 000000010 WS-NUM2 : 000000010 WS-NUM3 : 000000080 WS-NUM4 : 000000080 WS-NUMA : 000000010 WS-NUMB : 000000010 WS-NUMC : 000000010 WS-NUMD : 000000100 WS-NUME : 000000070
Multiply 動詞
Multiply 動詞用於乘法運算。
語法
以下是將兩個或多個數字相乘的語法 -
MULTIPLY A BY B C MULTIPLY A BY B GIVING E
在語法-1 中,將 A 和 B 相乘並將結果儲存在 B 中 (B=A*B)。將 A 和 C 相乘並將結果儲存在 C 中 (C = A * C)。
在語法-2 中,將 A 和 B 相乘並將結果儲存在 E 中 (E=A*B)。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9) VALUE 10 . 01 WS-NUM2 PIC 9(9) VALUE 10. 01 WS-NUM3 PIC 9(9) VALUE 10. 01 WS-NUMA PIC 9(9) VALUE 10. 01 WS-NUMB PIC 9(9) VALUE 10. 01 WS-NUMC PIC 9(9) VALUE 10. PROCEDURE DIVISION. MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3. MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUM3 : " WS-NUM3 DISPLAY "WS-NUMA : " WS-NUMA DISPLAY "WS-NUMB : " WS-NUMB DISPLAY "WS-NUMC : " WS-NUMC STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 000000010 WS-NUM2 : 000000100 WS-NUM3 : 000000100 WS-NUMA : 000000010 WS-NUMB : 000000010 WS-NUMC : 000000100
Divide 動詞
Divide 動詞用於除法運算。
語法
以下是除法運算的語法 -
DIVIDE A INTO B DIVIDE A BY B GIVING C REMAINDER R
在語法-1 中,將 B 除以 A 並將結果儲存在 B 中 (B=B/A)。
在語法-2 中,將 A 除以 B 並將結果儲存在 C 中 (C=A/B),並將餘數儲存在 R 中。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9) VALUE 5. 01 WS-NUM2 PIC 9(9) VALUE 250. 01 WS-NUMA PIC 9(9) VALUE 100. 01 WS-NUMB PIC 9(9) VALUE 15. 01 WS-NUMC PIC 9(9). 01 WS-REM PIC 9(9). PROCEDURE DIVISION. DIVIDE WS-NUM1 INTO WS-NUM2. DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUMA : " WS-NUMA DISPLAY "WS-NUMB : " WS-NUMB DISPLAY "WS-NUMC : " WS-NUMC DISPLAY "WS-REM : " WS-REM STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 000000005 WS-NUM2 : 000000050 WS-NUMA : 000000100 WS-NUMB : 000000015 WS-NUMC : 000000006 WS-REM : 000000010
Compute 語句
Compute 語句用於在 COBOL 中編寫算術表示式。這是 Add、Subtract、Multiply 和 Divide 的替代方法。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUM1 PIC 9(9) VALUE 10 . 01 WS-NUM2 PIC 9(9) VALUE 10. 01 WS-NUM3 PIC 9(9) VALUE 10. 01 WS-NUMA PIC 9(9) VALUE 50. 01 WS-NUMB PIC 9(9) VALUE 10. 01 WS-NUMC PIC 9(9). PROCEDURE DIVISION. COMPUTE WS-NUMC= (WS-NUM1 * WS-NUM2) - (WS-NUMA / WS-NUMB) + WS-NUM3. DISPLAY "WS-NUM1 : " WS-NUM1 DISPLAY "WS-NUM2 : " WS-NUM2 DISPLAY "WS-NUM3 : " WS-NUM3 DISPLAY "WS-NUMA : " WS-NUMA DISPLAY "WS-NUMB : " WS-NUMB DISPLAY "WS-NUMC : " WS-NUMC STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 : 000000010 WS-NUM2 : 000000010 WS-NUM3 : 000000010 WS-NUMA : 000000050 WS-NUMB : 000000010 WS-NUMC : 000000105
COBOL - 資料佈局
COBOL 佈局描述了每個欄位的用途以及其中存在的值。以下是 COBOL 中使用的資料描述條目:
- 重新定義子句
- 重新命名子句
- 用法子句
- 複製簿
重新定義子句
重新定義子句用於定義具有不同資料描述的儲存。如果一個或多個數據項不同時使用,則相同的儲存可用於另一個數據項。因此,可以使用不同的資料項引用相同的儲存。
語法
以下是重新定義子句的語法:
01 WS-OLD PIC X(10). 01 WS-NEW1 REDEFINES WS-OLD PIC 9(8). 01 WS-NEW2 REDEFINES WS-OLD PIC A(10).
以下是所用引數的詳細資訊:
- WS-OLD 是重新定義項
- WS-NEW1 和 WS-NEW2 是重新定義項
重新定義項和重新定義項的級別號必須相同,並且不能為 66 或 88 級別號。不要將 VALUE 子句與重新定義項一起使用。在檔案段中,不要將重新定義子句與 01 級別號一起使用。重新定義定義必須是您要重新定義的下一個資料描述。重新定義項的值始終與重新定義項相同。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-DESCRIPTION. 05 WS-DATE1 VALUE '20140831'. 10 WS-YEAR PIC X(4). 10 WS-MONTH PIC X(2). 10 WS-DATE PIC X(2). 05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8). PROCEDURE DIVISION. DISPLAY "WS-DATE1 : "WS-DATE1. DISPLAY "WS-DATE2 : "WS-DATE2. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
編譯並執行上述程式時,將產生以下結果:
WS-DATE1 : 20140831 WS-DATE2 : 20140831
重新命名子句
重新命名子句用於為現有資料項提供不同的名稱。它用於重新組合資料名稱併為其提供新名稱。新的資料名稱可以在組或基本項之間重新命名。級別號 66 保留用於重新命名。
語法
以下是重新命名子句的語法:
01 WS-OLD. 10 WS-A PIC 9(12). 10 WS-B PIC X(20). 10 WS-C PIC A(25). 10 WS-D PIC X(12). 66 WS-NEW RENAMES WS-A THRU WS-C.
僅在同一級別上才允許重新命名。在上面的示例中,WS-A、WS-B 和 WS-C 處於同一級別。重新命名定義必須是您要重新命名的下一個資料描述。不要將重新命名與 01、77 或 66 級別號一起使用。用於重新命名的資料名稱必須按順序排列。具有出現子句的資料項不能重新命名。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-DESCRIPTION. 05 WS-NUM. 10 WS-NUM1 PIC 9(2) VALUE 20. 10 WS-NUM2 PIC 9(2) VALUE 56. 05 WS-CHAR. 10 WS-CHAR1 PIC X(2) VALUE 'AA'. 10 WS-CHAR2 PIC X(2) VALUE 'BB'. 66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2. PROCEDURE DIVISION. DISPLAY "WS-RENAME : " WS-RENAME. STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-RENAME : 56AABB
用法子句
用法子句指定儲存格式資料的作業系統。它不能與級別號 66 或 88 一起使用。如果在組上指定了用法子句,則所有基本項將具有相同的用法子句。用法子句可用的不同選項如下:
顯示
資料項以 ASCII 格式儲存,每個字元佔用 1 個位元組。這是預設用法。
以下示例計算所需的位元組數:
01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY. It requires 8 bytes as sign and decimal doesn't require any byte. 01 WS-NUM PIC 9(5) USAGE IS DISPLAY. It requires 5 bytes as sign.
計算/COMP
資料項以二進位制格式儲存。在這裡,資料項必須是整數。
以下示例計算所需的位元組數:
01 WS-NUM PIC S9(n) USAGE IS COMP. If 'n' = 1 to 4, it takes 2 bytes. If 'n' = 5 to 9, it takes 4 bytes. If 'n' = 10 to 18, it takes 8 bytes.
COMP-1
資料項類似於 Real 或 Float,並表示為單精度浮點數。在內部,資料以十六進位制格式儲存。COMP-1 不接受 PIC 子句。這裡 1 個字等於 4 個位元組。
COMP-2
資料項類似於 Long 或 Double,並表示為雙精度浮點數。在內部,資料以十六進位制格式儲存。COMP-2 不指定 PIC 子句。這裡 2 個字等於 8 個位元組。
COMP-3
資料項以打包十進位制格式儲存。每個數字佔用半個位元組(1 個半位元組),符號儲存在最右邊的半位元組中。
以下示例計算所需的位元組數:
01 WS-NUM PIC 9(n) USAGE IS COMP. Number of bytes = n/2 (If n is even) Number of bytes = n/2 + 1(If n is odd, consider only integer part) 01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21. It requires 2 bytes of storage as each digit occupies half a byte. 01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21. It requires 3 bytes of storage as each digit occupies half a byte.
複製簿
COBOL 複製簿是一段定義資料結構的程式碼。如果某個特定的資料結構在許多程式中使用,那麼我們可以使用複製簿,而不是再次編寫相同的資料結構。我們使用 COPY 語句將複製簿包含到程式中。COPY 語句用於工作儲存段。
以下示例在 COBOL 程式中包含一個複製簿:
DATA DIVISION. WORKING-STORAGE SECTION. COPY ABC.
這裡 ABC 是複製簿名稱。ABC 複製簿中的以下資料項可以在程式內部使用。
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
COBOL - 條件語句
條件語句用於根據程式設計師指定的某些條件更改執行流程。條件語句始終計算為真或假。條件用於 IF、Evaluate 和 Perform 語句。條件的不同型別如下:
- IF 條件語句
- 關係條件
- 符號條件
- 類條件
- 條件名條件
- 否定條件
- 組合條件
IF 條件語句
IF 語句檢查條件。如果條件為真,則執行 IF 塊;如果條件為假,則執行 ELSE 塊。
END-IF 用於結束 IF 塊。要結束 IF 塊,可以使用句點代替 END-IF。但對於多個 IF 塊,始終建議使用 END-IF。
巢狀 IF - 出現在另一個 IF 塊內部的 IF 塊。巢狀 IF 語句的深度沒有限制。
語法
以下是 IF 條件語句的語法:
IF [condition] THEN [COBOL statements] ELSE [COBOL statements] END-IF.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1 WS-NUM3.
MOVE 15 TO WS-NUM2 WS-NUM4.
IF WS-NUM1 > WS-NUM2 THEN
DISPLAY 'IN LOOP 1 - IF BLOCK'
IF WS-NUM3 = WS-NUM4 THEN
DISPLAY 'IN LOOP 2 - IF BLOCK'
ELSE
DISPLAY 'IN LOOP 2 - ELSE BLOCK'
END-IF
ELSE
DISPLAY 'IN LOOP 1 - ELSE BLOCK'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
IN LOOP 1 - IF BLOCK IN LOOP 2 - ELSE BLOCK
關係條件
關係條件比較兩個運算元,這兩個運算元可以是識別符號、文字或算術表示式。無論大小和用法子句如何,都會對數字欄位進行代數比較。
對於非數字運算元
如果比較兩個大小相等的非數字運算元,則從左到右比較字元,直到到達末尾。包含更多字元的運算元被宣告為更大。
如果比較兩個大小不相等的非數字運算元,則在較短的資料項的末尾附加空格,直到運算元的大小相等,然後根據前一點中提到的規則進行比較。
語法
以下是關係條件語句的語法:
[Data Name/Arithmetic Operation] [IS] [NOT] [Equal to (=),Greater than (>), Less than (<), Greater than or Equal (>=), Less than or equal (<=) ] [Data Name/Arithmetic Operation]
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1.
MOVE 15 TO WS-NUM2.
IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
ELSE
DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
編譯並執行上述程式時,將產生以下結果:
WS-NUM1 IS GREATER THAN WS-NUM2
符號條件
符號條件用於檢查數字運算元的符號。它確定給定數字值是大於、小於還是等於零。
語法
以下是符號條件語句的語法:
[Data Name/Arithmetic Operation] [IS] [NOT] [Positive, Negative or Zero] [Data Name/Arithmetic Operation]
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(9) VALUE -1234.
01 WS-NUM2 PIC S9(9) VALUE 123456.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS POSITIVE THEN
DISPLAY 'WS-NUM1 IS POSITIVE'.
IF WS-NUM1 IS NEGATIVE THEN
DISPLAY 'WS-NUM1 IS NEGATIVE'.
IF WS-NUM1 IS ZERO THEN
DISPLAY 'WS-NUM1 IS ZERO'.
IF WS-NUM2 IS POSITIVE THEN
DISPLAY 'WS-NUM2 IS POSITIVE'.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
編譯並執行上述程式時,將產生以下結果:
WS-NUM1 IS NEGATIVE WS-NUM2 IS POSITIVE
類條件
類條件用於檢查運算元是否僅包含字母或數字資料。空格在 ALPHABETIC、ALPHABETIC-LOWER 和 ALPHABETIC-UPPER 中被視為有效字元。
語法
以下是類條件語句的語法:
[Data Name/Arithmetic Operation>] [IS] [NOT] [NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER] [Data Name/Arithmetic Operation]
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
01 WS-NUM2 PIC 9(9) VALUE 123456789.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS ALPHABETIC THEN
DISPLAY 'WS-NUM1 IS ALPHABETIC'.
IF WS-NUM1 IS NUMERIC THEN
DISPLAY 'WS-NUM1 IS NUMERIC'.
IF WS-NUM2 IS NUMERIC THEN
DISPLAY 'WS-NUM2 IS NUMERIC'.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-NUM1 IS ALPHABETIC WS-NUM2 IS NUMERIC
條件名條件
條件名是使用者定義的名稱。它包含使用者指定的一組值。它的行為類似於布林變數。它們使用級別號 88 定義。它不會有 PIC 子句。
語法
以下是使用者定義條件語句的語法:
88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9(3).
88 PASS VALUES ARE 041 THRU 100.
88 FAIL VALUES ARE 000 THRU 40.
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 65 TO WS-NUM.
IF PASS
DISPLAY 'Passed with ' WS-NUM ' marks'.
IF FAIL
DISPLAY 'FAILED with ' WS-NUM 'marks'.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Passed with 065 marks
否定條件
否定條件透過使用 NOT 關鍵字給出。如果條件為真,並且我們在其前面使用了 NOT,則其最終值為假。
語法
以下是否定條件語句的語法:
IF NOT [CONDITION] COBOL Statements END-IF.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(9) VALUE 25.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
DISPLAY 'IF-BLOCK'
ELSE
DISPLAY 'ELSE-BLOCK'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
ELSE-BLOCK
組合條件
組合條件包含兩個或多個使用邏輯運算子 AND 或 OR 連線的條件。
語法
以下是組合條件語句的語法:
IF [CONDITION] AND [CONDITION] COBOL Statements END-IF.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(2) VALUE 25.
01 WS-NUM3 PIC 9(2) VALUE 20.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
DISPLAY 'Both condition OK'
ELSE
DISPLAY 'Error'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
Both condition OK
Evaluate 動詞
Evaluate 動詞是一系列 IF-ELSE 語句的替代。它可以用來評估多個條件。它類似於 C 程式中的 SWITCH 語句。
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
MOVE 3 TO WS-A.
EVALUATE TRUE
WHEN WS-A > 2
DISPLAY 'WS-A GREATER THAN 2'
WHEN WS-A < 0
DISPLAY 'WS-A LESS THAN 0'
WHEN OTHER
DISPLAY 'INVALID VALUE OF WS-A'
END-EVALUATE.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-A GREATER THAN 2
COBOL - 迴圈語句
有些任務需要反覆執行,例如讀取檔案的每個記錄直到檔案結束。COBOL 中使用的迴圈語句有:
- 執行直到
- 執行直到
- 執行次數
- 執行變化
執行直到
執行直到用於透過按順序給出第一個和最後一個段落名稱來執行一系列段落。執行完最後一個段落後,控制權將返回。
內聯執行
PERFORM 內部的語句將執行,直到到達 END-PERFORM。
語法
以下是內聯執行的語法:
PERFORM DISPLAY 'HELLO WORLD' END-PERFORM.
非內聯執行
在這裡,一個語句在一個段落中執行,然後控制權轉移到另一個段落或部分。
語法
以下是非內聯執行的語法:
PERFORM PARAGRAPH1 THRU PARAGRAPH2
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. A-PARA. PERFORM DISPLAY 'IN A-PARA' END-PERFORM. PERFORM C-PARA THRU E-PARA. B-PARA. DISPLAY 'IN B-PARA'. STOP RUN. C-PARA. DISPLAY 'IN C-PARA'. D-PARA. DISPLAY 'IN D-PARA'. E-PARA. DISPLAY 'IN E-PARA'.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
IN A-PARA IN C-PARA IN D-PARA IN E-PARA IN B-PARA
執行直到
在“執行直到”中,一個段落將執行,直到給定的條件變為真。“帶前測試”是預設條件,它指示在執行段落中的語句之前檢查條件。
語法
以下是執行直到的語法:
PERFORM A-PARA UNTIL COUNT=5 PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5 PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CNT PIC 9(1) VALUE 0. PROCEDURE DIVISION. A-PARA. PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3. STOP RUN. B-PARA. DISPLAY 'WS-CNT : 'WS-CNT. ADD 1 TO WS-CNT.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-CNT : 0 WS-CNT : 1 WS-CNT : 2 WS-CNT : 3
執行次數
在“執行次數”中,一個段落將執行指定的次數。
語法
以下是執行次數的語法:
PERFORM A-PARA 5 TIMES.
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. A-PARA. PERFORM B-PARA 3 TIMES. STOP RUN. B-PARA. DISPLAY 'IN B-PARA'.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
IN B-PARA IN B-PARA IN B-PARA
執行變化
在執行變化中,一個段落將執行,直到 Until 短語中的條件變為真。
語法
以下是執行變化的語法:
PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC 9 VALUE 0. PROCEDURE DIVISION. A-PARA. PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5 STOP RUN. B-PARA. DISPLAY 'IN B-PARA ' WS-A.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
IN B-PARA 1 IN B-PARA 2 IN B-PARA 3 IN B-PARA 4
GO TO 語句
GO TO 語句用於更改程式中的執行流程。在 GO TO 語句中,轉移只能向前進行。它用於退出一個段落。使用的 GO TO 語句的不同型別如下:
無條件 GO TO
GO TO para-name.
條件 GO TO
GO TO para-1 para-2 para-3 DEPENDING ON x.
如果“x”等於 1,則控制權將轉移到第一個段落;如果“x”等於 2,則控制權將轉移到第二個段落,依此類推。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC 9 VALUE 2. PROCEDURE DIVISION. A-PARA. DISPLAY 'IN A-PARA' GO TO B-PARA. B-PARA. DISPLAY 'IN B-PARA '. GO TO C-PARA D-PARA DEPENDING ON WS-A. C-PARA. DISPLAY 'IN C-PARA '. D-PARA. DISPLAY 'IN D-PARA '. STOP RUN.
JCL 用於執行上述 COBOL 程式
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
編譯並執行上述程式時,將產生以下結果
IN A-PARA IN B-PARA IN D-PARA
COBOL - 字串處理
COBOL 中的字串處理語句用於對字串執行多種功能操作。以下是字串處理語句:
- 檢查
- 字串
- 拆分字串
檢查
Inspect 動詞用於計算或替換字串中的字元。字串操作可以對字母數字、數字或字母值執行。Inspect 操作從左到右執行。用於字串操作的選項如下:
計數
計數選項用於計算字串字元。
語法
以下是計數選項的語法:
INSPECT input-string TALLYING output-count FOR ALL CHARACTERS
使用的引數為:
- 輸入字串 - 要計算其字元的字串。
- 輸出計數 - 用於儲存字元計數的資料項。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CNT1 PIC 9(2) VALUE 0. 01 WS-CNT2 PIC 9(2) VALUE 0. 01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'. PROCEDURE DIVISION. INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER. DISPLAY "WS-CNT1 : "WS-CNT1. INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'. DISPLAY "WS-CNT2 : "WS-CNT2 STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-CNT1 : 15 WS-CNT2 : 06
替換
替換選項用於替換字串字元。
語法
以下是替換選項的語法:
INSPECT input-string REPLACING ALL char1 BY char2.
使用的引數為:
輸入字串 - 要從 char1 替換為 char2 的字串的字元。
示例
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'. PROCEDURE DIVISION. DISPLAY "OLD STRING : "WS-STRING. INSPECT WS-STRING REPLACING ALL 'A' BY 'X'. DISPLAY "NEW STRING : "WS-STRING. STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
OLD STRING : ABCDACDADEAAAFF NEW STRING : XBCDXCDXDEXXXFF
字串
String 動詞用於連線字串。使用 STRING 語句,可以將兩個或多個字元字串組合成一個更長的字串。“由...分隔”子句是強制性的。
語法
以下是 String 動詞的語法:
STRING ws-string1 DELIMITED BY SPACE ws-string2 DELIMITED BY SIZE INTO ws-destination-string WITH POINTER ws-count ON OVERFLOW DISPLAY message1 NOT ON OVERFLOW DISPLAY message2 END-STRING.
以下是所用引數的詳細資訊:
- ws-string1 和 ws-string2:要連線的輸入字串
- ws-string:輸出字串
- ws-count:用於計算新連線字串的長度
- 分隔符指定字串的結尾
- 指標和溢位是可選的
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30).
01 WS-STR1 PIC A(15) VALUE 'Tutorialspoint'.
01 WS-STR2 PIC A(7) VALUE 'Welcome'.
01 WS-STR3 PIC A(7) VALUE 'To AND'.
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
STRING WS-STR2 DELIMITED BY SIZE
WS-STR3 DELIMITED BY SPACE
WS-STR1 DELIMITED BY SIZE
INTO WS-STRING
WITH POINTER WS-COUNT
ON OVERFLOW DISPLAY 'OVERFLOW!'
END-STRING.
DISPLAY 'WS-STRING : 'WS-STRING.
DISPLAY 'WS-COUNT : 'WS-COUNT.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-STRING : WelcomeToTutorialspoint WS-COUNT : 25
拆分字串
Unstring 動詞用於將一個字串拆分為多個子字串。“由...分隔”子句是強制性的。
語法
以下是 Unstring 動詞的語法:
UNSTRING ws-string DELIMITED BY SPACE INTO ws-str1, ws-str2 WITH POINTER ws-count ON OVERFLOW DISPLAY message NOT ON OVERFLOW DISPLAY message END-UNSTRING.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30) VALUE 'WELCOME TO TUTORIALSPOINT'.
01 WS-STR1 PIC A(7).
01 WS-STR2 PIC A(2).
01 WS-STR3 PIC A(15).
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
UNSTRING WS-STRING DELIMITED BY SPACE
INTO WS-STR1, WS-STR2, WS-STR3
END-UNSTRING.
DISPLAY 'WS-STR1 : 'WS-STR1.
DISPLAY 'WS-STR2 : 'WS-STR2.
DISPLAY 'WS-STR3 : 'WS-STR3.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-STR1 : WELCOME WS-STR2 : TO WS-STR3 : TUTORIALSPOINT
COBOL - 表格處理
COBOL 中的陣列稱為表。陣列是一種線性資料結構,是相同型別個別資料項的集合。表的數 據項在內部排序。
表宣告
表在資料部分宣告。Occurs 子句用於定義表。Occurs 子句指示資料名稱定義的重複。它只能與從 02 到 49 開始的級別號一起使用。不要將 occurs 子句與 Redefines 一起使用。一維表和二維表的描述如下:
一維表
在一維表中,occurs 子句在宣告中只使用一次。WSTABLE 是包含表的組項。WS-B 命名重複 10 次的表元素。
語法
以下是定義一維表的語法:
01 WS-TABLE. 05 WS-A PIC A(10) OCCURS 10 TIMES.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.
PROCEDURE DIVISION.
DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
二維表
二維表是透過使兩個資料元素都具有可變長度建立的。作為參考,請檢視語法,然後嘗試分析表。第一個陣列 (WS-A) 可以重複 1 到 10 次,內部陣列 (WS-C) 可以重複 1 到 5 次。對於 WS-A 的每個條目,將有相應的 5 個 WS-C 條目。
語法
以下是定義二維表的語法:
01 WS-TABLE.
05 WS-A OCCURS 10 TIMES.
10 WS-B PIC A(10).
10 WS-C OCCURS 5 TIMES.
15 WS-D PIC X(6).
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 2 TIMES.
10 WS-B PIC A(10) VALUE ' TUTORIALS'.
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(6) VALUE ' POINT'.
PROCEDURE DIVISION.
DISPLAY "TWO-D TABLE : "WS-TABLE.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
下標
可以使用下標訪問表個別元素。下標值可以從 1 到表出現的次數。下標可以是任何正數。它不需要在資料部分進行任何宣告。它會隨著 occurs 子句自動建立。
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
DISPLAY 'WS-TABLE : ' WS-TABLE.
DISPLAY 'WS-A(1) : ' WS-A(1).
DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
DISPLAY 'WS-A(2) : ' WS-A(2).
DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
DISPLAY 'WS-A(3) : ' WS-A(3).
DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
DISPLAY 'WS-C(3,2) : ' WS-C(3,2).
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
WS-TABLE : 12ABCDEF34GHIJKL56MNOPQR WS-A(1) : 12ABCDEF WS-C(1,1) : ABC WS-C(1,2) : DEF WS-A(2) : 34GHIJKL WS-C(2,1) : GHI WS-C(2,2) : JKL WS-A(3) : 56MNOPQR WS-C(3,1) : MNO WS-C(3,2) : PQR
索引
也可以使用索引訪問表元素。索引是從表開頭到元素的位移。索引使用帶 INDEXED BY 子句的 Occurs 子句宣告。索引的值可以使用 SET 語句和 PERFORM Varying 選項更改。
語法
以下是定義表中索引的語法:
01 WS-TABLE. 05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
STOP RUN.
A-PARA.
PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
C-PARA.
DISPLAY WS-C(I,J).
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
ABC DEF GHI JKL MNO PQR
Set 語句
Set語句用於更改索引值。Set動詞用於初始化、增加或減少索引值。它與Search和Search All一起用於在表中定位元素。
語法
以下是使用Set語句的語法:
SET I J TO positive-number SET I TO J SET I TO 5 SET I J UP BY 1 SET J DOWN BY 5
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
SET I J TO 1.
DISPLAY WS-C(I,J).
SET I J UP BY 1.
DISPLAY WS-C(I,J).
STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
ABC JKL
Search
Search是一種線性搜尋方法,用於查詢表內的元素。它可以對已排序和未排序的表執行。它僅用於由Index短語宣告的表。它從索引的初始值開始。如果未找到要搜尋的元素,則索引會自動增加1,並繼續到表的末尾。
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
01 WS-SRCH PIC A(1) VALUE 'M'.
PROCEDURE DIVISION.
MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
SET I TO 1.
SEARCH WS-A
AT END DISPLAY 'M NOT FOUND IN TABLE'
WHEN WS-A(I) = WS-SRCH
DISPLAY 'LETTER M FOUND IN TABLE'
END-SEARCH.
STOP RUN.
執行上述 COBOL 程式的**JCL**。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
LETTER M FOUND IN TABLE
Search All
Search All是一種二分搜尋方法,用於查詢表內的元素。對於Search All選項,表必須按排序順序排列。索引不需要初始化。在二分搜尋中,表被分成兩半,並確定要搜尋的元素位於哪一半。此過程重複,直到找到元素或到達末尾。
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
10 WS-NUM PIC 9(2).
10 WS-NAME PIC A(3).
PROCEDURE DIVISION.
MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
SEARCH ALL WS-RECORD
AT END DISPLAY 'RECORD NOT FOUND'
WHEN WS-NUM(I) = 93
DISPLAY 'RECORD FOUND '
DISPLAY WS-NUM(I)
DISPLAY WS-NAME(I)
END-SEARCH.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO
當您編譯並執行上述程式時,它會生成以下結果:
RECORD FOUND 93 MNO
COBOL - 檔案處理
COBOL中的檔案概念與C/C++中的不同。在學習COBOL中“檔案”的基礎知識時,不應將兩種語言的概念關聯起來。簡單的文字檔案不能在COBOL中使用,而是使用PS(物理順序)和VSAM檔案。本模組將討論PS檔案。
要理解COBOL中的檔案處理,必須瞭解基本術語。這些術語僅用於理解檔案處理的基礎知識。在“檔案處理動詞”一章中將進一步討論更深入的術語。以下是基本術語:
- 欄位
- 記錄
- 物理記錄
- 邏輯記錄
- 檔案
以下示例有助於理解這些術語:
欄位
欄位用於指示儲存關於元素的資料。它表示單個元素,如上例所示,例如學生ID、姓名、分數、總分和百分比。任何欄位中的字元數稱為欄位大小,例如,學生姓名可以有10個字元。欄位可以具有以下屬性:
主鍵是每個記錄中唯一的欄位,用於識別特定記錄。例如,在學生成績檔案中,每個學生將具有唯一的學生ID,構成主鍵。
外部索引鍵是唯一或非唯一欄位,用於搜尋相關資料。例如,在學生成績檔案中,當不知道學生ID時,可以使用學生的全名作為外部索引鍵。
描述符欄位用於描述實體。例如,在學生成績檔案中,分數和百分比欄位為記錄新增含義,被稱為描述符。
記錄
記錄是用於描述實體的一組欄位。一個或多個欄位一起形成一個記錄。例如,在學生成績檔案中,學生ID、姓名、分數、總分和百分比構成一個記錄。記錄中所有欄位的累積大小稱為記錄大小。檔案中存在的記錄可以是固定長度或可變長度的。
物理記錄
物理記錄是存在於外部裝置上的資訊。它也稱為塊。
邏輯記錄
邏輯記錄是程式使用資訊。在COBOL程式中,一次只能處理一個記錄,稱為邏輯記錄。
檔案
檔案是相關記錄的集合。例如,學生成績檔案包含所有學生的記錄。
COBOL - 檔案組織
檔案組織指示記錄如何在檔案中組織。檔案有不同型別的組織,以提高訪問記錄的效率。以下是檔案組織方案的型別:
- 順序檔案組織
- 索引順序檔案組織
- 相對檔案組織
本模組中提到的語法及其各自的術語僅指它們在程式中的用法。使用這些語法的完整程式將在“檔案處理動詞”一章中討論。
順序檔案組織
順序檔案包含按順序儲存和訪問的記錄。以下是順序檔案組織的關鍵屬性:
記錄可以按順序讀取。要讀取第10條記錄,必須先讀取所有之前的9條記錄。
記錄按順序寫入。不能在中間插入新記錄。新記錄始終插入到檔案的末尾。
將記錄放入順序檔案後,無法刪除、縮短或延長記錄。
記錄的順序一旦插入,就永遠無法更改。
可以更新記錄。如果新記錄長度與舊記錄長度相同,則可以覆蓋記錄。
順序輸出檔案是列印的良好選擇。
語法
以下是順序檔案組織的語法:
INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name-jcl ORGANIZATION IS SEQUENTIAL
索引順序檔案組織
索引順序檔案包含可以順序訪問的記錄。也可以進行直接訪問。它包含兩個部分:
資料檔案包含按順序排列的記錄。
索引檔案包含主鍵及其在資料檔案中的地址。
以下是順序檔案組織的關鍵屬性:
記錄可以按順序讀取,就像在順序檔案組織中一樣。
如果知道主鍵,則可以隨機訪問記錄。索引檔案用於獲取記錄的地址,然後從資料檔案中獲取記錄。
在此檔案系統中維護排序索引,該索引將鍵值與記錄在檔案中的位置相關聯。
還可以建立備用索引以獲取記錄。
語法
以下是索引順序檔案組織的語法:
INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name-jcl ORGANIZATION IS INDEXED RECORD KEY IS primary-key ALTERNATE RECORD KEY IS rec-key
相對檔案組織
相對檔案包含按其相對地址排序的記錄。以下是相對檔案組織的關鍵屬性:
記錄可以按順序讀取,就像在順序和索引檔案組織中一樣。
可以使用相對鍵訪問記錄。相對鍵表示記錄相對於檔案起始地址的位置。
可以使用相對鍵插入記錄。相對地址是使用相對鍵計算的。
相對檔案提供對記錄的最快訪問。
此檔案系統的主要缺點是,如果缺少一些中間記錄,它們也會佔用空間。
語法
以下是相對檔案組織的語法:
INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name-jcl ORGANIZATION IS RELATIVE RELATIVE KEY IS rec-key
COBOL - 檔案訪問模式
到目前為止,已經討論了檔案組織方案。對於每種檔案組織方案,都可以使用不同的訪問模式。以下是檔案訪問模式的型別:
- 順序訪問
- 隨機訪問
- 動態訪問
本模組中提到的語法及其各自的術語僅指它們在程式中的用法。使用這些語法的完整程式將在下一章中討論。
順序訪問
當訪問模式為順序時,記錄檢索方法會根據所選的檔案組織而改變。
對於順序檔案,記錄按插入的相同順序訪問。
對於索引檔案,用於獲取記錄的引數是記錄鍵值。
對於相對檔案,相對記錄鍵用於檢索記錄。
語法
以下是順序訪問模式的語法:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS INDEXED ACCESS MODE IS SEQUENTIAL RECORD KEY IS rec-key1 ALTERNATE RECORD KEY IS rec-key2 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS RELATIVE ACCESS MODE IS SEQUENTIAL RELATIVE KEY IS rec-key1
隨機訪問
當訪問模式為RANDOM時,記錄檢索方法會根據所選的檔案組織而改變。
對於索引檔案,記錄根據放置在鍵欄位中的值進行訪問,該鍵欄位可以是主鍵或備用鍵。可以存在一個或多個備用索引。
對於相對檔案,記錄透過相對記錄鍵檢索。
語法
以下是隨機訪問模式的語法:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS rec-key1 ALTERNATE RECORD KEY IS rec-key2 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS rec-key1
動態訪問
動態訪問在同一個程式中支援順序和隨機訪問。使用動態訪問,一個檔案定義用於執行順序和隨機處理,例如按順序訪問某些記錄,並按其鍵訪問其他記錄。
對於相對檔案和索引檔案,動態訪問模式允許您在讀取檔案時在順序訪問模式和隨機訪問模式之間來回切換,方法是在READ語句上使用NEXT短語。NEXT和READ功能將在下一章中討論。
語法
以下是動態訪問模式的語法:
ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS SEQUENTIAL ACCESS MODE IS DYNAMIC RECORD KEY IS rec-key1 ALTERNATE RECORD KEY IS rec-key2 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT file-name ASSIGN TO dd-name ORGANIZATION IS RELATIVE ACCESS MODE IS DYNAMIC RELATIVE KEY IS rec-key1
COBOL - 檔案處理動詞
檔案處理動詞用於對檔案執行各種操作。以下是檔案處理動詞:
- Open
- Read
- Write
- Rewrite
- Delete
- Start
- Close
Open動詞
Open是必須執行的第一個檔案操作。如果Open成功,則只有其他操作才能在檔案上執行。只有在開啟檔案後,檔案結構中的變數才能用於處理。每個檔案操作後都會更新FILE STATUS變數。
語法
OPEN "mode" file-name.
這裡,file-name是字串文字,您將使用它來命名您的檔案。檔案可以以下列模式開啟:
| 序號 | 模式和描述 |
|---|---|
| 1 |
Input Input模式用於現有檔案。在此模式下,我們只能讀取檔案,不允許對檔案執行任何其他操作。 |
| 2 |
Output Output模式用於在檔案中插入記錄。如果使用順序檔案並且檔案包含某些記錄,則首先會刪除現有記錄,然後在新檔案中插入新記錄。對於索引檔案或相對檔案,情況並非如此。 |
| 3 |
Extend Extend模式用於在順序檔案中追加記錄。在此模式下,記錄將插入到末尾。如果檔案訪問模式為Random或Dynamic,則不能使用Extend模式。 |
| 4 |
I-O Input-Output模式用於讀取和重寫檔案記錄。 |
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。
示例:以下示例使用行順序組織讀取現有檔案。可以使用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編譯和執行此程式,它將顯示檔案中存在的所有記錄。在大機伺服器上,我們不使用文字檔案,而是使用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.
COBOL - 子程式
Cobol子程式是可以獨立編譯但不能獨立執行的程式。子程式有兩種型別:內部子程式,如Perform語句,和外部子程式,如CALL動詞。
CALL動詞
CALL動詞用於將控制權從一個程式轉移到另一個程式。包含CALL動詞的程式稱為呼叫程式,被呼叫的程式稱為被呼叫程式。呼叫程式的執行將暫停,直到被呼叫程式完成執行。Exit Program語句用於在被呼叫程式中將控制權轉移回。
被呼叫程式約束
以下是被呼叫程式的要求:
Linkage節必須在被呼叫程式中定義。它包含在程式中傳遞的資料元素。資料項不應具有Value子句。PIC子句必須與透過呼叫程式傳遞的變數相容。
Procedure division using包含從呼叫程式傳遞的變數列表,並且順序必須與Call動詞中提到的順序相同。
Exit program語句用於在被呼叫程式中將控制權轉移回。它必須是被呼叫程式中的最後一個語句。
引數可以透過兩種方式在程式之間傳遞:
- 按引用
- 按內容
按引用呼叫
如果被呼叫程式中變數的值被修改,則它們的新值將反映在呼叫程式中。如果沒有指定BY子句,則變數始終按引用傳遞。
語法
以下是按引用呼叫子程式的語法:
CALL sub-prog-name USING variable-1, variable-2.
示例
以下示例是MAIN呼叫程式,UTIL是被呼叫程式:
IDENTIFICATION DIVISION. PROGRAM-ID. MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STUDENT-ID PIC 9(4) VALUE 1000. 01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'. PROCEDURE DIVISION. CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME. DISPLAY 'Student Id : ' WS-STUDENT-ID DISPLAY 'Student Name : ' WS-STUDENT-NAME STOP RUN.
被呼叫程式
IDENTIFICATION DIVISION. PROGRAM-ID. UTIL. DATA DIVISION. LINKAGE SECTION. 01 LS-STUDENT-ID PIC 9(4). 01 LS-STUDENT-NAME PIC A(15). PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME. DISPLAY 'In Called Program'. MOVE 1111 TO LS-STUDENT-ID. EXIT PROGRAM.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = MAIN
當您編譯並執行上述程式時,它會生成以下結果:
In Called Program Student Id : 1111 Student Name : Tim
按內容呼叫
如果被呼叫程式中變數的值被修改,則它們的新值將不會反映在呼叫程式中。
語法
以下是按內容呼叫子程式的語法:
CALL sub-prog-name USING BY CONTENT variable-1, BY CONTENT variable-2.
示例
以下示例是MAIN呼叫程式,UTIL是被呼叫程式:
IDENTIFICATION DIVISION. PROGRAM-ID. MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STUDENT-ID PIC 9(4) VALUE 1000. 01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'. PROCEDURE DIVISION. CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME. DISPLAY 'Student Id : ' WS-STUDENT-ID DISPLAY 'Student Name : ' WS-STUDENT-NAME STOP RUN.
被呼叫程式
IDENTIFICATION DIVISION. PROGRAM-ID. UTIL. DATA DIVISION. LINKAGE SECTION. 01 LS-STUDENT-ID PIC 9(4). 01 LS-STUDENT-NAME PIC A(15). PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME. DISPLAY 'In Called Program'. MOVE 1111 TO LS-STUDENT-ID. EXIT PROGRAM.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = MAIN
當您編譯並執行上述程式時,它會生成以下結果:
In Called Program Student Id : 1000 Student Name : Tim
呼叫型別
呼叫有兩種型別:
靜態呼叫發生在使用NODYNAM編譯器選項編譯程式時。靜態呼叫的程式在編譯時載入到儲存器中。
動態呼叫發生在使用DYNAM和NODLL編譯器選項編譯程式時。動態呼叫的程式在執行時載入到儲存器中。
COBOL - 內部排序
對檔案中的資料進行排序或合併兩個或多個檔案是幾乎所有面向業務的應用程式中常見的必要操作。排序用於按升序或降序排列記錄,以便可以執行順序處理。COBOL中使用兩種用於檔案排序的技術:
外部排序用於透過在JCL中使用SORT實用程式對檔案進行排序。我們在JCL章節中討論過這一點。目前,我們將重點關注內部排序。
內部排序用於在COBOL程式中對檔案進行排序。SORT動詞用於對檔案進行排序。
SORT動詞
COBOL中的排序過程使用三個檔案:
輸入檔案是要按升序或降序排序的檔案。
工作檔案用於在排序過程中儲存記錄。輸入檔案記錄被傳輸到工作檔案以進行排序過程。此檔案應在SD條目下的File-Section中定義。
輸出檔案是排序過程結束後獲得的檔案。它是SORT動詞的最終輸出。
語法
以下是排序檔案的語法:
SORT work-file ON ASCENDING KEY rec-key1 [ON DESCENDING KEY rec-key2] USING input-file GIVING output-file.
SORT執行以下操作:
以I-O模式開啟work-file,以INPUT模式開啟input-file,以OUTPUT模式開啟output-file。
將input-file中存在的記錄傳輸到work-file。
按rec-key以升序/降序對SORT-FILE進行排序。
將排序後的記錄從work-file傳輸到output-file。
關閉input-file和output-file,並刪除work-file。
示例
在以下示例中,INPUT是需要按升序排序的輸入檔案:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT ASSIGN TO IN.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
FILE SECTION.
FD INPUT.
01 INPUT-STUDENT.
05 STUDENT-ID-I PIC 9(5).
05 STUDENT-NAME-I PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
SORT WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT GIVING OUTPUT.
DISPLAY 'Sort Successful'.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN DD DSN = INPUT-FILE-NAME,DISP = SHR //OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR //WRK DD DSN = &&TEMP
當您編譯並執行上述程式時,它會生成以下結果:
Sort Successful
MERGE動詞
使用MERGE語句合併兩個或多個具有相同順序的檔案。合併過程中使用的檔案:
- 輸入檔案:Input-1、Input-2
- 工作檔案
- 輸出檔案
語法
以下是合併兩個或多個檔案的語法:
MERGE work-file ON ASCENDING KEY rec-key1 [ON DESCENDING KEY rec-key2] USING input-1, input-2 GIVING output-file.
MERGE執行以下操作:
以I-O模式開啟work-file,以INPUT模式開啟input-files,以OUTPUT模式開啟output-file。
將input-files中存在的記錄傳輸到work-file。
按rec-key以升序/降序對SORT-FILE進行排序。
將排序後的記錄從work-file傳輸到output-file。
關閉input-file和output-file,並刪除work-file。
示例
在以下示例中,INPUT1和INPUT2是要按升序合併的輸入檔案:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT1 ASSIGN TO IN1.
SELECT INPUT2 ASSIGN TO IN2.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
FILE SECTION.
FD INPUT1.
01 INPUT1-STUDENT.
05 STUDENT-ID-I1 PIC 9(5).
05 STUDENT-NAME-I1 PIC A(25).
FD INPUT2.
01 INPUT2-STUDENT.
05 STUDENT-ID-I2 PIC 9(5).
05 STUDENT-NAME-I2 PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
MERGE WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT1, INPUT2 GIVING OUTPUT.
DISPLAY 'Merge Successful'.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP1 EXEC PGM = HELLO //IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR //IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR //OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR //WRK DD DSN = &&TEMP
當您編譯並執行上述程式時,它會生成以下結果:
Merge Successful
COBOL - 資料庫介面
到目前為止,我們已經學習了在COBOL中使用檔案的方法。現在,我們將討論COBOL程式如何與DB2互動。它涉及以下術語:
- 嵌入式SQL
- DB2應用程式程式設計
- 主機變數
- SQLCA
- SQL查詢
- 遊標
嵌入式SQL
嵌入式SQL語句用於在COBOL程式中執行標準SQL操作。在編譯應用程式程式之前,SQL處理器會預處理嵌入式SQL語句。COBOL被稱為主機語言。COBOL-DB2應用程式是包含COBOL和DB2的應用程式。
嵌入式SQL語句的工作方式與普通SQL語句類似,但有一些細微的差別。例如,查詢的輸出將定向到一組預定義的變數,這些變數稱為主機變數。在SELECT語句中添加了一個INTO子句。
DB2應用程式程式設計
以下是編寫COBOL-DB2程式時需要遵循的規則:
所有SQL語句必須用EXEC SQL和ENDEXEC分隔。
SQL語句必須在Area B中編碼。
程式中使用的所有表都必須在WorkingStorage節中宣告。這是透過使用INCLUDE語句完成的。
除INCLUDE和DECLARE TABLE之外的所有SQL語句都必須出現在Procedure Division中。
主機變數
主機變數用於接收來自表的資料或在表中插入資料。必須為要在程式和DB2之間傳遞的所有值宣告主機變數。它們在Working-Storage節中宣告。
主機變數不能是組項,但可以組合在主機結構中。它們不能被Renamed或Redefined。在SQL語句中使用主機變數時,在它們前面加上冒號 (:)。
語法
以下是宣告主機變數並在Working-Storage節中包含表的語法:
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE table-name
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 STUDENT-REC.
05 STUDENT-ID PIC 9(4).
05 STUDENT-NAME PIC X(25).
05 STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
SQLCA
SQLCA 是一個 SQL 通訊區域,DB2 透過它將 SQL 執行的反饋傳遞給程式。它告訴程式執行是否成功。SQLCA 下面有一些預定義的變數,例如包含錯誤程式碼的 **SQLCODE**。SQLCODE 中的值“000”表示執行成功。
語法
以下是如何在 Working-Storage 部分宣告 SQLCA 的語法:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC.
SQL查詢
假設我們有一個名為“Student”的表,其中包含學生 ID、學生姓名和學生地址。
STUDENT 表包含以下資料:
Student Id Student Name Student Address 1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
以下示例演示瞭如何在 COBOL 程式中使用 **SELECT** 查詢:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
EXEC SQL
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID=1004
END-EXEC.
IF SQLCODE = 0
DISPLAY WS-STUDENT-RECORD
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP001 EXEC PGM = IKJEFT01 //STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
當您編譯並執行上述程式時,它會生成以下結果:
1004 Chulbul Pandey Lucknow
以下示例演示瞭如何在 COBOL 程式中使用 **INSERT** 查詢:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.
MOVE 'TutorialsPoint' TO WS-STUDENT-NAME.
MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.
EXEC SQL
INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Inserted Successfully'
DISPLAY WS-STUDENT-REC
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP001 EXEC PGM = IKJEFT01 //STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT = * //SYSUDUMP DD SYSOUT = * //SYSOUT DD SYSOUT = * //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
當您編譯並執行上述程式時,它會生成以下結果:
Record Inserted Successfully 1005 TutorialsPoint Hyderabad
以下示例演示瞭如何在 COBOL 程式中使用 **UPDATE** 查詢:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
EXEC SQL
UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
WHERE STUDENT-ID = 1003
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Updated Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP001 EXEC PGM = IKJEFT01 //STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR //SYSPRINT DD SYSOUT = * //SYSUDUMP DD SYSOUT = * //SYSOUT DD SYSOUT = * //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
當您編譯並執行上述程式時,它會生成以下結果:
Record Updated Successfully
以下 **示例** 演示瞭如何在 COBOL 程式中使用 **DELETE** 查詢:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.
EXEC SQL
DELETE FROM STUDENT
WHERE STUDENT-ID=:WS-STUDENT-ID
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Deleted Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP001 EXEC PGM = IKJEFT01 //STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT = * //SYSUDUMP DD SYSOUT = * //SYSOUT DD SYSOUT = * //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
當您編譯並執行上述程式時,它會生成以下結果:
Record Deleted Successfully
遊標
遊標用於一次處理多行選擇。它們是儲存查詢所有結果的資料結構。它們可以在 Working-Storage 部分或 Procedure Division 中定義。以下是與遊標相關的操作:
- 宣告
- Open
- Close
- 獲取
宣告遊標
遊標宣告可以在 Working-Storage 部分或 Procedure Division 中完成。第一個語句是 DECLARE 語句,這是一個非可執行語句。
EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC.
Open
在使用遊標之前,必須執行 Open 語句。Open 語句準備 SELECT 以供執行。
EXEC SQL OPEN STUDCUR END-EXEC.
Close
Close 語句釋放遊標佔用的所有記憶體。在結束程式之前關閉遊標是強制性的。
EXEC SQL CLOSE STUDCUR END-EXEC.
獲取
Fetch 語句標識遊標並將值放入 INTO 子句中。Fetch 語句在迴圈中編碼,因為我們一次獲取一行。
EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC.
以下示例演示瞭如何使用遊標從 STUDENT 表中獲取所有記錄:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.
PROCEDURE DIVISION.
MOVE 1001 TO WS-STUDENT-ID.
PERFORM UNTIL SQLCODE = 100
EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC
DISPLAY WS-STUDENT-REC
END-PERFORM
STOP RUN.
執行上述 COBOL 程式的JCL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
當您編譯並執行上述程式時,它會生成以下結果:
1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
