COBOL(Common Business Oriented Language)语言、即公用面向商业语言,是一种面向过程的高级程序设计语言,主要用于数据处理,是目前国际上应用最广泛的一种高级语言。
COBOL作为大型机上最主要的程序设计语言,迄今50多年历史。
大型机也叫主机、大机或MainFrame等,属于一种商用高端服务器。主要由IBM公司生产。
1960年4月正式发表COBOL61,目前最新版COBOL2002。
COBOL程序的每行代码通常分为80列。有非标准80列的可以超过80列,写多少列都可以。
80列中列与列之间不同的范围及其意义如下:
第1-6列:序号区
第7列:指示符区:
A. “ ”空,后接正常的COBOL语句。
B. "*" 注释符,注释当前行。
C. "/" 注释符,注释当前行,程序编译时,强制程序清单另起一页。
D. "-" 字符串连接符。
E. "D" Debug行标识符,Debug模式时,该行代码执行。
F. "B" 标明BATCH程序。
G. "C" 标明CICS程序。
第8-11列:A区:包括COBOL中的部/节/语句段的标识符,以及01层数据层号等
第12-72列:B区:包含过程部中的各条语句
第72-80列:说明区:用于对程序进行注释,代码修改的日期和修正记号一般写在此区。
每个完整的COBOL程序代码都是由4个部组成的。这4个部依次为标志部、环境部、数据部、过程部。部与部之间的先后顺序不可更改。
由"IDENTIFICATION DIVISION"关键字标识,主要用来描述与程序本身相关的信息
PROGRAM-ID:指明程序名,是必须具备的字段。其他字段都是可选的。
AUTHOR:开发程序的程序员名
INSTALLATION:通常指设计该程序的公司或部门
DATE-WRITTEN:指明程序编写或修改的日期
DATE-COMPILED:指明程序编译的日期
SECURITY:通常用于列出具有访问该程序权限的用户
环境部用来说明程序运行的软硬件环境,是COBOL程序中唯一与设备相关的部分,将程序中用到的内部文件与外部设备建立起来联系。
由"ENVIRONMENT DIVISION"标识。紧跟标志部之后,没有可省略不写的。
配置节:由"CONFIGURATION SECTION"标识:作用:指定程序同外部环境之间的一些配置信息。可省略不写
SOURCE-COMPUTER:指示编译程序的计算机
OBJECT-COMPUTER:描述运行程序的计算机
输入/输出节:由"INPUT-OUTPUT SECTION"标识:作用:指定程序中所用到文件同外部环境之间的对应关系
FILE-CONTROL:用于指定文件的对应关系,是该节点中主要用到的字段。
I-O-CONTROL:用于定义程序返回点,不同文件共享内存区,以及多文件
卷中文件的位置
作用:程序中涉及到的全部数据(输入,输出,中间)都要在此定义,对它们的属性进行说明。主要描述一下属性:①数据类型(数值/字符)和存储形式(长度)②数据项间的关系(层次和层号) ③文件与记录的关系
由"DATA DIVISION" 标识。紧接环境部之后。
文件节:由"FILE-SECTION"标识。用于对程序中用到的文件里的数据进行定义。文件指逻辑文件。其文件名必须和环境部输入/输出节中由SELECT语句指定的文件名一致。
在文件节中,主要以FD语句实现对文件定义。在FD语句下,通过PIC语句依次定义文件中每条记录所含的数据项。
任何在程序中所使用的文件都需要在此处定义
FD是"File Descriptor"的缩写,即文件描述符的意思。
FD语句通过句点表示结束。
FD或SD下定义多个01层的场合隐含地重新定义同一区域。相当于被REDEFINES了。相当于隐形的内存共享。
COBOL中,01层属于最高层,需要在程序中顶格写。各层层号按顺序编写,不一定连续。COBOL中最多支持49层,因此49层为最低层
66层:为特殊描述符项目保留,在实际中用得较少,用于重新编制前面已定义的数据项,必须包含一个RENAMES从句。
77层:用于某个组的数据项,如程序中的临时变量;用于标识一个独立的初等项,它不属于其他组合的初等项。
88层:主要用于条件判断中,用于标识一个条件名变量。
重要的是不同层次数据间的关系,而不是数据的层号。
没有PIC语句的为数据组,有PIC语句的则为单元数据项
PIC是"PICTURE"的缩写,PIC语句用来定义数据的类型及长度
"X"表示任意字符,"9"表示只能为数字,括号内代表长度
工作存储节:由"WORKING-STORAGE SECTION"标识。作用:用于定义本程序中所需用到的各种数据
规定工作存储节应该写在文件节之后。程序中没有用到外部文件,文件节是可以省略的,但是工作存储节都是会存在的。因为程序中一般总会要用到本地数据的。
联接节(LINKAGE SECTION):用来描述与调用程序间发生数据传递的数据项。(即参数)
注:参数除了可以通过主程序的CALL语句来传送之外,也可以通过JCL的EXEC语句的PARM参数来传送。='AAAAAAA8'
作用:编写程序要执行的语句,是程序的核心。
由"PROCEDURE DIVISION"标识。 逻辑处理部分都在过程部中。
"STOP RUN"表明程序的结束
1.主程序:调用其他程序的程序。
A. 主程序过程部的部头:PROCEDURE DIVISION.
B. 过程部中应该包括一个程序出口语句:STOP RUN.(逻辑上最后一句语句)
C. 程序最后标志结束语句,END PROGRAM 程序名.(标记此行后再无程序语句。)
2.子程序:被其他程序所调用的程序。
A. 子程序过程部的头部:PROCEDURE DIVISION USING 从主程序中接收到的参数名1,参数名2.
B. 过程部中应该包括一个程序出口语句:EXIT PROGRAM.(逻辑上最后一句语句)
子程序概述:PERFORM语句只能在同一程序中多次调用某一语句序列,如果被调用部分较复杂或需要被其他程序使用时,可以将其编写为单独的一个程序,即子程序,调用子程序的为主程序。
使用子程序的优点:
简化主程序,使程序结构清晰
子程序功能单一,易于编写和调试,减少错误
可由多人完成不同子程序,从而完成复杂任务
只需重编译修改的子程序,而不必对所有源程序编译
子程序可以重用,减少重复劳动
①MOVE语句:MOVE语句的赋值操作,可以实现变量赋值,参数传递等多项类似的功能。
CORRESPONDING/CORR:对应传送。
CORRESPONDING/CORR:对应传送。
一般格式:MOVE [CORR] 数据项1 TO 数据项2.
把一个组合项中若干项传送给另一组合项中的同名的项。
对应传送与层号无关。
所谓同名,指的是它们有相同的全程受限(全程同名)
在COBOL程序中,标识名必须唯一识别。受限名的引用使用'OF'限定符。
例如:
01 TODAY-DATE.
03 YEAR PIC 9(4).
03 MONTH PIC 9(2).
03 DAY PIC 9(2).
01 LAST-DATE.
03 YEAR PIC 9(4).
03 MONTH PIC 9(2).
03 DAY PIC 9(2).
MOVE 2012 TO YEAR OF TODAY-DATE.
//如果限定一次还不能成为唯一,可以多次使用限定符。
MOVE 'TEST' TO IN-DATA1. 把TEST赋值给IN-DATA1变量
MOVE IN-DATA1 TO OUT-DATA1. 把IN-DATA1变量的值给OUT-DATA变量
②PERFORM语句:调用函数,把一段代码写一个函数,通过PERFORM语句调用。简化代码等目的。PERFORM语句只能在同一程序中多次调用某一语句序列
PERFORM 100-COPY-PROCESS.
.....
PERFORM 100-COPY-PROCESS.
....
STOP RUN.
100-COPY-PROCESS.
MOVE IN-DATA1 TO SAVE-REC1.
MOVE IN-DATA2 TO SAVE-REC2.
MOVE R-NUM TO S-NUM.
③ACCEPT语句:用于接收从键盘或指定设备上获得输入数据
//用于接收从键盘或指定设备上获得输入数据
一般格式:ACCEPT 标识符 [FROM 助忆名]
ACCEPT后只能有一个标识符,标识符可以是组合项。
FROM 助忆名:指定环境中特定的设备,助忆名需要在环境部中定义。
ENVIRONMENT DIVISION.
CONFIGRATION SECTION.
SPECIAL-NAMES.
CONSOLE IS ABC.
ACCEPT T FROM ABC.//则表示要从控制台接收数据
如:ACCEPT TEST-DATA.
表示从数据项TEST-DATA运行JCL中的SYSIN的DD语句接收一个数据。
//固定取得系统提供的日期和时间信息
ACCEPT TEST-DATE FROM DATE. //系统当前日期(YYMMDD)
ACCEPT TEST-DATE FROM DATE-YYYYMMDD. //系统当前日期(YYYYMMDD)
ACCEPT TEST-DATE FROM DAY. //一年中第几天(YYDDD)
ACCEPT TEST-DATE FROM DAY-OF-WEEK. //当天是星期几(W)
ACCEPT TEST-DATE FROM TIME. //系统当前时间(HHMMSS99)
④DISPLAY语句:用于对数据实现输出操作。数据之间可以用逗号或空格隔开。
MOVE 'COBOL' TO T-LANG.
DISPLAY 'Hello World'.
DISPLAY 'THIS IS A OUT' ,T-LANG.
上面程序输出结果:
Hello World
THIS IS A OUT COBOL
⑤CONTINUE语句:用来指定一个空操作,即什么也不做,用来占位置。程序将顺序执行到CONTINUE语句的下一条语句。
⑥OPEN语句:用来实现对文件的打开操作。在对文件进行任何处理之前,必须通过OPEN语句打开。OPEN语句可指定该文件在打开后是用于输入操作还是输出操作。
文件操作有一个文件状态字(FILE-STATUS)
一般格式:OPEN INPUT/OUTPUT/I-O/EXTEND FILE1.
OPEN INPUT CUSTOMER-FILE
OUTPUT PRINT-FILE.
OPEN INPUT IN-FILE1 IN-FILE2.
INPUT:输入文件,打开的文件只能读取。
OUTPUT:输出文件,打开的文件只能写入。覆盖的形式写入。
I-O:输入输出文件,打开的文件可以读取也可以写入。
EXTEND:输出文件,打开顺序文件,只能写入,将记录插入到现有文件的末尾
⑦CLOSE语句:用于关闭已打开的文件。CLOSE语句同样可以出现在程序的任何位置,不过该语句通常写于程序结尾或最后一条读写文件的语句之后。
CLOSE CUSTOMER-FILE PRINT-FILE.
CLOSE IN-FILE1.
CLOSE IN-FILE2.
⑧READ语句:从外部文件读取数据存储到指定的数据项中。
用于从文件中读取数据。使用READ语句读取文件时,实际上是将文件中的数据读到由FD语句所定义的变量之中。
READ语句每次只能读取一条。因此通常将READ语句置于一个循环结构体中,以顺次读取到文件中的每一条记录。
READ语句中包含有AT END选项。该选项表示的意思是当读到文件末尾时将采取何种操作。
OPEN INPUT CUSTOMER-FILE.
READ CUSTOMER-FILE
AT END MOVE 'Y' TO EOF-FLAG
END-READ.
PERFORM 100-READ-NEXT
UNTIL EOF-FLAG = 'Y'.
CLOSE CUSTOMER-FILE.
STOP RUN.
100-READ-NEXT.
READ CUSTOMER-FILE
AT END MOVE 'Y' TO EOF-FLAG
END-READ.
⑨WRITE语句:WRITE语句用于对文件进行写入。将内存数据输出到外部设备(外部文件PS、VSAM)
WRITE CUSTOMER-RECORD.
⑩CALL语句:调用子程序
CALL '程序名' USING 参数1 .
⑪ENTRY语句:定义程序的入口开始执行,其他程序通过call entry定义入口名称进行使用。
ENTRY '入口名' USING 参数1 ...
其他程序通过
CALL '入口名'. 进行调用
⑫ STRING语句:合并字符串,用来将多个非数值型数据项的值连接后发送到一个接收数据项中,在合并过程中可以删除某些指定的字符
下划线"_"代表一个空格。
一般格式:
STRING str1 DELIMITED BY symbol1
str2 DELIMITED BY symbol2
INTO strn
WITH POINTER position1
ON OVERFLOW per语句...
END-STRING.
77 A PIC X(4) VALUE 'ABC'.
77 B PIC X(4) VALUE 'JKL'.
77 C PIC X(4) VALUE 'XYZ'.
77 D PIC X(16) VALUE '****************'.
DELIMITED BY SIZE:按发送项的长度全部传送到接收项。
例:
STRING A,B,C DELIMITED BY SIZE INTO D.
结果D='ABC_JKL_XYZ_****'
DELIMITED BY SPACE:将发送项空格之前的字符串传送到接收项
例:
STRING A,B,C DELIMITED BY SPACE INTO D.
结果D='ABCJKLXYZ*******'(末尾七个*)
DELIMITED BY 字符常量:使用其他字符作为定界符,各个发送项可以使用不同的定界符
例:
STRING A DELIMITED BY 'B'
B DELIMITED BY 'L'
C DELIMITED BY 'M'
INTO D.
结果D='AJKXYZ_*********'(末尾九个*)
可以在传送中插入所需字符
例:
STRING A,'*',B,'=',C DELIMITED BY SPACE INTO D.
结果D='ABC*JKL=XYZ*****'(末尾五个*)
POINTER:如果不想从接收项的最左端开始接收字符,可以使用POINTER短语指定从某一字符位开始接收字符
例:
MOVE 3 TO P.
STRING A,B,C DELIMITED BY SPACE
WITH POINTER P
INTO D.
结果D='**ABCJKLXYZ*****'(头部两个,末尾五个*)
ON OVERFLOW:如果接收项的字符个数不足,则发生溢出,可以进行溢出处理
例:
77 D PIC X(10).
STRING A,B,C DELIMITED BY SIZE INTO D
ON OVERFLOW DISPLAY 'OVER FLOW'.
结果D='ABC_JKL_XY''OVER FLOW'
注意:
接收数据项必须是初等项。
指针必须是一个整型的初等项。
STRING语句结束后,接收项中未送入的字符位置上保持原有内容,而不是自动设置空格。
STRING
FIRST-NAME DELIMITED BY SPACE
' ' DELIMITED BY SIZE
LAST-NAME DELIMITED BY SPACE
INTO FULL-NAME.
//STRING 合并字符串用于合并的字符串后面都要加上DELIMITED BY 子句。
//DELIMITED BY 子句后面有两个选项,分别为SPACE 和SIZE
//SPACE:找到前面用于合并的字符串中第一次出现空格的地方。
//将该空格以前的部分进行合并,空格以后的内容包括该空格在内不参与合并操作。
//SIZE:将前面对应的用于合并的字符串中的全部内容进行合并。
⑬UNSTRING语句:拆分字符串,相当于STRING语句的逆运算。
将一个发送字符串拆成若干个接收字符串,是STRING语句的逆操作。
下划线"_"代表一个空格。
一般格式:
UNSTRING str1 DELIMITED BY symbol1
INTO strn1 [DELIMITER IN str3] [COUNT IN str4]....
WITH POINTER position1
TALLYING IN str8
ON OVERFLOW per语句...
NOT ON OVERFLOW per语句...
END-STRING.
77 A PIC X(23) VALUE 'DATE PRODUCT QUANTITY'.
77 B PIC X(5).
77 C PIC X(8).
77 D PIC X(8).
DELIMITED:设置分解时的定界符。自左向右累计字符,直到遇见定界符,符号左面的内容按MOVE语句的规则传送到接收项。
例:
UNSTRING A DELIMITED BY SPACE INTO B,C,D.
结果:B='DATE_'、C='PRODUCT_'、D='QUANTITY'
//将字符串A分解,如果B项接收长度满了则C开始接收,如果C项接收长度满了D开始接收。
如果发送字符串被DELIMITED分解界定符,分解份数多于接收侧个数,则只取前几份接收侧个数。若分割份数少于接收侧,则不够的份数不传值。
例:
UNSTRING A DELIMITED BY 'T' INTO B,C,D.
结果:B='DA___'、C='E_PRODUC'、D='_QUAN___'
COUNT:用于计算已经传到接收项的字符数量。
例:
UNSTRING A DELIMITED BY 'T' INTO B COUNT IN W.
结果:B='DA___'、W=2
DELIMITER:是定界符存储短语,如果使用多个定界符,在传送接收项时,同事把界定符存储。
例:
77 X PIC X(1).
77 Y PIC X(1).
77 Z PIC X(1).
UNSTRING A DELIMITED BY 'T' OR ALL ' ' OR 'R' INTO B DELIMITER IN X
C DELIMITER IN Y
D DELIMITER IN Z.
结果:B='DA___'、C='E_______'、D='P_______'、X='T'、Y='_'、Z='R'
POINTER指针短语,指定从发送项的某位开始发送。
例:
77 U PIC 9(1).
MOVE 2 TO U.
UNSTRING A DELIMITED BY 'T' INTO B POINTER U.
结果:B='A____'、U=4
TALLYING接收项计数短语,用来记录实际接收项的项数。
例:
77 N PIC 9(1).
UNSTRING A DELIMITED BY 'M' INTO B,C,D TALLYING IN N.
结果:B='DATE_'、C='________'、D='________'、N=1
溢出短语OVERFLOW。
UNSTRING FULL-NAME
DELIMITED BY ' '
INTO FIRST-NAME LAST-NAME.
//通过' '进行拆分 FULL-NAME
⑭INSPECT语句:替换字符串
//1.全体字符进行替换
INSPECT SOURCE-STRING
REPLACING ALL 'A' BY 'B'.
//替换后生成的新字符串覆盖以前的字符串
//2.对前缀字符串进行替换
INSPECT语句中加上"LEADING"实现
//所谓前缀:指从字符串开头处连续出现的一串字符.
//3.对首字符进行替换
//INSPECT语句中加上"FIRST"实现
INSPECT TEST-STRING
REPLACING FIRST '*' BY 'B'.
//4.TALLYING 用来计算CCC在AAA出现的次数,结果放到BBB中
INSPECT AAA TALLYING BBB FOR ALL CCC.
⑮FUNCTION语句:字符串转换,在后加LOWER-CASE或者UPPER-CASE选项。
MOVE FUNCTION LOWER-CASE(SOURCE-STR) TO NEW-STR.
//LOWER-CASE只是临时对其进行转换,转换后结果只在该条语句有效。
//LOWER-CASE并不将转换结果保存到原字符串中,若要保存转换后的字符串,
//通常用MOVE语句将其保存到一个新的字符串变量中。
将字符串转换为具体数值
FUNCTION语句实现,在后加NUMVAL或者NUMVAL-C选项。
FUNCTION NUMVAL(SOURCE-STR1) + FUNCTION NUMVAL(SOURCE-STR2) .
必须使用NUMVAL-C因为字符串中有$或者有分隔符逗号。
FUNCTION NUMVAL-C(SOURCE-STR1) + FUNCTION NUMVAL-C(SOURCE-STR2) .
转换后数值数据的长度不能超过18个数字。
⑯NEXT SENTENCE语句:调到下一个句号(.)后面的语句,而不是NEXT SENTENCE后的语句
⑰SET、SEARCH语句:
SET KEY TO 1. //SET 对索引的赋值,把1赋值给KEY //SET KEY UP BY 1. KEY自增1。
SEARCH AAA
AT END
//语句段
WHEN BBB(KEY) = CCC
//语句段
END-SEARCH.
//SEARCH检索(线性检索)
//1.WHEN后表达式如果不满足,就使KEY自动加1,如果满足表达式情况就进行相应的语句段操作,查询操作停止。
//2.AT END 没检索到时执行的操作.
⑱COPY语句:将预先写好的文本复制到源程序的源代码中。COPY语句可用在COBOL的任意地方.
1.COPY AAA500.
2.COPY AAA500 REPLACING BBB BY BBA.//把AAA500文件内容BBB替换为BBA
3.COPY AAA500 DISJOINING BBB JOINING BBA AS PREFIX .//把AAA500文件中变量名的头从BBB替换为BBA.
⑲INITIALIZE语句:初始化语句
将数据项的值设为初始值。字符型初始化成空格,数字型初始化为0.用于组合项时,相当于将所有的基本项都初始化。
INITIALIZE语句对FILLER的VALUE值无效,(保留VALUE值),除非指定其有效。
⑳GO TO语句:无条件转移语句,用来改变程序的执行顺序,程序执行到此将无条件转移到指定的标号(段名/节名),
由于打乱了原来程序正常的执行顺序,降低了程序的可读性,因此,严禁使用
//程序执行到此语句时,无条件的转到指定的节或者段去.
1.GO TO S-1.
//I=1时,转到A段,I=2时,转到B段以此类推,当1≤I<5时会正常跳转,否则执行此语句的下一语句。
2.GO TO A,B,C,D,E DEPENGING ON I.
(21)IF:条件分支语句
(22)EVALUATE:条件分支语句
(23)EXIT PROGRAM:与STOP RUN做相同处理
(24)EXIT:提供一组过程的公共出口,或者说它指出了被调用过程的逻辑终点,一般用作PERFORM语句序列的出口。EXIT语句必须是段中唯一的语句,前面必须有段名。
(25)STOP RUN:表明程序的结束,停止语句。STOP RUN在逻辑上应该是程序的最后一个语句。STOP RUN执行后,程序停止运行,停止后不能再接着运行,如需要,可重新运行一次。主程序一般通过STOP RUN语句结束运行单元。
(26)STOP 定数:定数,程序执行到此暂停,根据用户入力数据来执行相应的操作。(属于非互换性对应,不适用移行)
互换性的例子。人们常用的自行车,它的零件都是按照互换性生产的。如果自行车的某个零件坏了,可以在五金商店买到相同规格的零件更换,恢复自行车的功能。这些自行车零件,在同一规格内都可以互相替换使用,它们都是具有互换性的零部件。
(27)GOBACK:返回语句。停止运行,将控制权返回给上一级。子程序必须用GOBACK,而不能用STOP,因为STOP停止的是一个RUN UNIT(运行单元).
(28)LENGTH OF:取得一个项目的长度
(29)
以后继续补充
①9型:数字型
05 VAL PIC 9(06) VALUE 999999. //表示在该位置上可以放入一个0-9之间的数字 ,称数字型
②S9型:符号+数字型---->详见附录1:最后一位+符号变化。
03 TS PIC S9(04). //如果想在数据项中放入一个带符号的数,可以用该描述符。
//系统在内存中该数据项的最后一个字节中,放入一个标记,表示此数为负或正。
③S9V9:小数型
05 WK PIC S9(02)V99. //“V”描述符:支持在数值型数据结构中隐含的小数点位置
//数据显示为99.99,实际输出时没有点,实际占4位
④编辑型:编辑型
用来描述在程序中只是作为输出数据时增加或改变某些所需的符号,起编辑作用。不能用于计算。
03 KIN PIC 99.99.
03 WT PIC ZZ9.9. //Z代表空格
03 WT1 PIC ***,***.
03 WT2 PIC 99B99B99. //B代表空格
03 WT3 PIC 9(4)CR. //整数不显示CR,负数才显示CR
03 WT4 PIC 9(4)DB. //整数不显示DB,负数才显示DB
03 WT5 PIC $99999.
03 WT6 PIC -999.
03 WT7 PIC +9(5).
03 WT8 PIC 9999099099. //直接插入 0表示插入字符0
⑤COMP:定点二进制数
COMP-1:浮动小数点
COMP-2:内部长浮点型
COMP-3:压缩十进制数
COMP-4:压缩十进制数
COMP-5:压缩十进制数
01 WK1 PIC S9(04) COMP. //实际占两位
01 WK2 USAGE COMP-2.
01 WK3 PIC S9(11) COMP-3. //实际占6位
01 WK4 PIC S9(009) COMP-4.
⑥BINARY:二进制数
01 WK PIC S9(09) BINARY.
⑦BIT型:比特型:以一个比特位为存储单位。只能存放0和1这两种值。
03 WK.
05 WK1 PIC 1(001) BIT OCCURS 8. //定义一个数组,每一项是一比特,共有8比特。
//COBOL语言中的表(TABLE)类似于其他高级语言中的数组(ARRAY)
//1. OCCURS子句不能出现在77层,因为77层是独立的数据项。
//2.OCCURS子句不能用于01层。
//3.只有当OCCURS所说明的数据是初等项时,才能在该数据项的描述中使用PIC子句。
//4.不能用VALUE子句对表赋初值,不能同时用OCCURS子句和VALUE子句来描述同一数据项。
⑧X型:字符型数据(半角)非数值型,不能用于计算
01 WK PIC X. //字符型数据由任意的COBOL字符组成的数据。
⑨N型:汉字型(全角) J型(同N型)
02 WK PIC N(004) VALUE IS NC'新規作成' . //一个汉字占两个字节
⑩G型:汉字型(全角)
07 FILLER PIC G(18) USAGE DISPLAY-1.
⑪A型:字母型
07 WK PIC A. //这种类型的数据项中只能放字母或空格
⑫常量:非数值常量
象征常量 象征常量的内容
ZERO(ZEROS,ZEROES) 一个或多个数字0或者字符"0"
SPACE(SPACES) 一个或多个空白或空格
HIGH-VALUE(HIGH-VALUES) 将对应的二进制码全部置为1
LOW-VALUE(LOW-VALUES) 将对应的二进制码全部置为0
QUOTE(QUOTES) 引号 (")
ALL 相应字符连接而成的字符串
01 TEST-DATA PIC X(10).
MOVE SPACES TO TEST-DATA. //TEST-DATA为10个连续的空格
MOVE ALL 'ABC' TO TEST-DATA. //TEST-DATA为'ABCABCABCA'
MOVE LOW-VALUES TO TEST-DATA. //TEST-DATA为10个连续的0
⑬EXTERNAL:引用相同的数据区域。内存共享。变量共享等等
⑭VALUE:给变量赋初值。
⑮OCCURS:数组,动态游标DEPENDING ON
⑯INDEXED:OCCURS语句中INDEXED有的场合,指定数组的下标。
02 KT1 OCCURS 1 INDEXED K1 PIC 9(14).
SET K1 TO 1.
SEARCH KT1 VARYING K1 AT END GO TO K2
WHEN KT1 (K1) = F4 (V)
MOVE ZEROS TO F1
GO TO F2.
⑰COLUMN:指定输出位置。COLUMN NUMBER短语 表示此项目是打印项目,并指定打印行上的打印位置。
02 M1 PIC 9(04) COLUMN 114.
⑱REDEFINES:用于对同一块内存区域进行重定义。通过REDEFINES语句可以定义多个指向同一内存区域的变量。
WORKING-STORAGE SECTION.
01 TEST-AREA.
05 TEST-A PIC X(4).
05 TEST-B REDEFINES TEST-A.
05 TEST-C REDEFINES TEST-A.
PROCEDURE DIVISION.
MOVE 'TEST' TO TEST-A.
DISPLAY TEST-A.
DISPLAY TEST-B.
DISPLAY TEST-C.
STOP RUN.
上面程序输出结果:
TEST
TEST
TEST
注意:REDEFINES语句不能用于对66层,88层数据进行重定义。同时,不能对文件节中的01层数据重定义。不过,对于工作存储节中的01层数据则是可以重定义的。
REDEFINES命令:同层变量共用一个内存空间。
当REDEFINES的变量长度不一致时,开辟的共同存储区域的大小和大size一致。
⑲16进制文字常量:H"hh" X"30"
16进制汉字常量:K"hh"
汉字区点常量:J"hh"
⑳SIGN 指定符号位置的表现形式:
LEADING:指定符号位在左边显示。
TRAILING:指定符号位在右边显示。
03 K1 PICTURE IS S9(007)
USAGE IS DISPLAY
SIGN IS LEADING SEPARATE. //DISPLAY 显示符号位,并且占1byte
(21)BLANK WHEN ZERO:项目值为零时,清空为空白。
03 P1 PIC ZZZ.Z BLANK WHEN ZERO.
03 P2 PIC 999.9 BLANK WHEN ZERO.
03 P3 PIC -9(5) BLANK WHEN ZERO.
补充:COBOL语言总结(二)
①算数加运算ADD
1.NUM2=NUM1+NUM2 NUM1值不变,NUM2值被覆盖。
ADD NUM1 TO NUM2
ON SIZE ERROR
DISPLAY 'OVER FLOW!'
END-ADD
2.可以多个数值相加、NUM3=NUM1+NUM2+NUM3 NUM1值不变, NUM2值不变,NUM3值被覆盖。
ADD NUM1 NUM2 TO NUM3
ON SIZE ERROR
DISPLAY 'OVER FLOW!'
END-ADD
3.ADD使用GIVING子句,不覆盖原值。省略END-ADD
ADD NUM1 NUM2 TO NUM3
GIVING TOTAL.
TOTAL=NUM1+NUM2+NUM3 NUM1值不变, NUM2值不变,NUM3值不变。
②算数减运算SUBTRACT
1.NUM3=NUM3-NUM1-NUM2 NUM1值不变, NUM2值不变,NUM3值被覆盖。
SUBTRACT NUM1 NUM2 FROM NUM3.
END-SUBTRACT
2.RESULT=NUM3-NUM2-NUM1 NUM1值不变, NUM2值不变,NUM3值不变。ROUNDED四舍五入。
SUBTRACT NUM1 NUM2 FROM NUM3
GIVING RESULT
ROUNDED.
③算数乘运算MULTIPLY
MULTIPLY与* 都表示算数乘运算。
1.NUM2 = NUM2 * NUM1
MULTIPLY NUM1 BY NUM2
ON SIZE ERROR
DISPLAY 'OVER FLOW'
END-MULTIPLY.
④算数除运算DIVIDE
DIVIDE与/ 都表示算数除运算。
1.NUM2=NUM2 /NUM1
DIVIDE NUM1 INTO NUM2
END-DIVIDE.
⑤乘方运算**
COMPUTE(计算) 主要是通过算数表达式进行算数运算的。乘方的运算符 **
COMPUTE RESULT = NUM1 ** NUM2
ON SIZE ERROR
DISPLAY 'OVER FLOW'
END-COMPUTE
⑥复合运算 括号运算
⑦统计运算
计算总和:COMPUTE sum-name= FUCTION SUM(name1 name2 name3 ...)
计算中位数:COMPUTE middle-name= FUCTION MEDIAN(name1 name2 name3 ...)
计算平均数:COMPUTE average-name= FUCTION MEAN(name1 name2 name3 ...)
⑧四舍五入运算 ROUNDED
ROUNDED选项对运算结果进行四舍五入是对运算结果中第一位小数进行舍入操作的。
不加ROUNDED,默认计算结果取整的话,结果会被截断。例57.9--->57
加上ROUNDED,对57.9进行四舍五入处理-->58
⑨运算结果溢出报错ON SIZE ERROR
运算结果溢出:当结果数据长度超过保存结果数据的变量所定义的长度时。当运算结果溢出时,可以使用ON SIZE ERROR选项进行报错
⑩REMAINDER语句:用于除法语句(DIVIDE)求余数
关系运算主要是对两个操作数间大小的关系进行比较。(=、>、<、>=、<=、NOT=、NOT>、NOT<)
AND、OR、NOT
VSAM即虚拟存储访问方式的意思。使用VSAM组织数据,管理数据信息的文件称为VSAM文件。
VSAM文件对于数据的存储及管理具有很强的灵活性及高效性,因此常用来组织和存放数据。
COBOL程序对于文件的访问,很大程度上是对VSAM文件的访问。
VSAM文件的分类及作用?
LDS:线性数据集
ESDS:进入顺序数据集
RRDS:相对记录数据集
KSDS:索引顺序数据集,最常用
VRRDS:变长相对记录数据集
COBOL只是实现对VSAM文件的的读写操作。至于VSAM文件的创建,复制,删除等操作是通过JCL中的IDCAMS实用程序实现的。
SELECT KS-FILE ASSIGN TO VKSDS
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS TEST-KEY
FILE STATUS IS TEST-STAT.
....
FD KS-FILE
LABEL RECORD IS STANDARD
DATA RECORD IS KSRCD.
COPY KSRCD.
说明:
该VSAM文件在系统中的名称为VKSDS,在本程序中的名称为KS-FILE。对于
在环境部中对KS-FILE文件所指定的各项参数分别介绍如下。
ORGANIZATION:用于指定VSAM文件的逻辑结构。通常可以为SEQUENTIAL
或INDEXED,默认时为SEQUENTIAL。
ACCESS MODE:用于指定对该VSAM文件的访问模式。通常可以为SEQUENTIAL
RANDOM或DYNAMIC。其中SEQUENTIAL对应顺序访问方式,RANDOM对应直接
访问方式,DYNAMIC即可为顺序访问方式,又可为直接访问方式。
RECORD KEY:用于指定Key在程序中的名称
FILE STATUS:用于反映VSAM文件被读取或写入的状态。
通过LABEL RECORD IS STANDARD指明该VSAM文件是否含有标号(label).
通过DATA RECORDS IS U01-DATA.定义该VSAM文件中逻辑记录在程序中的名称。
通过COPY将逻辑记录复制到程序工作区域中。
WRITE命令或REWRITE命令对数据进行写入或改写。
WRITE命令用于OUTPUT或I-O模式打开的VSAM文件。
REWRITE命令只能用于以I-O模式打开的VSAM文件。
DELETE命令:删除VSAM文件中记录的相应代码。
DELETE KS-FILE01 RECORD
INVALID KEY N DISPLAY 'DELETE FAILED'.
VSAM文件为索引文件时,KSDS 在COBOL中还可提供指针定位的功能。代码如下:
START KS-FILE02 KEY < TEST-VALUE
INVALID KEY
DISPLAY 'NO SUCH RECORD'.
后续补充
COBOL语言总结(三)--JCL扩展
后续补充
EBCDIC SHIFT_JIS 文字
D0 -0 P
D1 -1 Q
D2 -2 R
D3 -3 S
D4 -4 T
D5 -5 U
D6 -6 V
D7 -7 W
D8 -8 X
D9 -9 Y
C0 0 @
C1 1 A
C2 2 B
C3 3 C
C4 4 D
C5 5 E
C6 6 F
C7 7 G
C8 8 H
C9 9 I