cobol介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
英文缩写: COBOL (Common business Oriented Language)
中文译名: COBOL语言
解释: 一种适合于商业及数据处理的类似英语的程序设计语言。
这种语言可使商业数据处理过程精确表达。
COBOL(面向商业的通用语言,又称为企业管理语言、数据处理语言等,Common Business Oriented Langauge)是最早的高级编程语言之一,是世界上第一个商用语言。
1 COBOL的历史
1959年5月,五角大楼委托格雷斯·霍波(G.Hopper)博士领导一个委员会并由Rear Admiral Grace Hopper公司主持开发,并于1961年由美国数据系统语言协会公布。
正式发布于1960年4月,称为Cobol-60。
1959年12月出现了第一个COBOL语言文本,并于1960年4月正式发表,因此也被称为COBOL-60。
1968年美国国家标准委员会ANSI 又通过了新的标准ANSI COBOL X.3.23-1968。
1972年国际标准化组织ISO将其作为ISO COBOL-72。
1974年ANSI对COBOL-68作出了修订扩充,形成了ANSI COBOL X3.23-1974,随后1978年ISO采用其形成ISO COBOL-78,后来又提出了ANSI X3.23-85,增加了很多结构化程序设计的内容,ISO标准ISO1989:1985也采用了该标准。
COBOL 标准还在不断地改进和完善,最新的标准COBOL 2002主体已经于2002年12月出版,其他部分还在不断地完善之中。
现在最新的版本是Cobol-2002。
1963年,美国国家标准研究所(ANSI)进行了标准化,但是ANSI标准很少被遵循;因此,COBOL程序只是部分可移植的。
2 COBOL的重要性
经过40多年的不断修改、丰富完善和标准化,COBOL已发展为多种版本的庞大语言,在财会工作、统计报表、计划编制、情报检索、人事管理等数据管理及商业数据处理领域,都有着广泛的应用。
COBOL的重要性可以用这句话来描述:世界上70%的数据都是用COBOL语言处理的,并且90%的A TM事务处理用的都是COBOL语言。
每天在线处理的COBOL事务有300亿次。
500强中有492家(包括全部的100强)使用了COBOL语言,目前在COBOL方面的投资已经超过3万亿美元,,据称用COBOL书写的程序超过了1000亿行,并且以每年大约50亿行代码的速度在增长。
由于COBOL在商业领域的雄厚基础,而且COBOL主要是应用于银行、金融和会计行业等非常重要的商业数据处理领域。
所以,即使对于具有相当经验的IT公司来说,重新编写COBOL语言的可靠的应用软件也是不实际或是从商业角度上并不可行的,而且还要花上很长的时间,只要大型机存在,COBOL就不会消失,即使是对电脑界产生巨大影响的“千年虫”(Y2K)也没有改变COBOL的命运。
3 COBOL的特点
COBOL是一种面向数据处理的、面向文件的、面向过程(POL)的高级编程语言,是一种功能很强而又极为冗长的语言。
COBOL适合于具有循环处理周期的环境(例如打印工资支票)以及数据操纵量相当大的环境。
COBOL主要应用于商业数据处理领域,对各种类型的数据进行收集、存储、传送、分类、排序、计算及打印报表、输出图象是它的强项。
COBOL语法与英文很接近,即使不懂电脑的人也能看懂程序。
强大的文件处理功能,大量的数据通常以文件的形式存储在磁盘上。
仅提供了加、减、乘、除及乘方这五种简单的算术运算,因而不适于进行科学计算。
未来的COBOL将支持XML等Web时代的新技术。
4 COBOL的程序结构
COBOL程序由4部(DIVISION)组成:IDENTIFICATION DIVISION.(标识部)、ENVIRONMENT DIVISION.(环境部)、DA TA DIVISION.(数据部)、PROCEDURE DIVISION.(过程部),而每个部又由若干节(SECTION)组成
1.编码格式
第1~6列为序号区,用于表示行号。
行号不是必须的,也不必是顺序的,甚至可以是本机字符集中的任意字符,但正确的行号是很重要的。
第7列为指示区,可以包含如下指示符:
"*"指示本行内容为注释。
"-"指示本行代码为上一行的延续。
"D"指示本行代码为调试代码,将在启用DEBUGGING模式时被编译,未启用时将被忽略。
"/"指示编译器为源码列表开始新的一页,并且本行将被视为注释。
第8~11列为A区。
下列项必须从A区开始:
部标题(DIVISION)
节标题(SECTION)
段名(段标题)
层指示符FD和SD,层号01和77
DECLARATIVES 和END DECLARATIVES
END PROGRAM
第12~72列为B区。
作为程序主体的条目(entries),句子(sentences),语句(statements),从句(clauses)和续行(/)等都必须从B区开始。
*句法说明:
节(SECTIONs)和段(paragraphs)定义了程序,它们又细分为以下部分:
条目(entries):以句点(.)结尾的一系列从句。
构造于标识部、环境部和数据部。
从句(clauses):连续的COBOL字符串的有序集合,用于指定条目的某个属性。
构造于标识部、环境部和数据部。
句子(sentences):以句点(.)结尾的一个或多个语句的序列。
构造于过程部。
语句(statements):指定程序要执行的某个动作。
构造于过程部。
短语(phrases):构成从句和语句的更小单元。
2.基本结构
----|----1----|----2----|----3----|----4----|----5----|----6----|----7----|----8
//标识部
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. PGMNAME. //指定本程序名。
此段是必须的,并且必须排在标识部的最前头。
//环境部
000003 ENVIRONMENT DIVISION.
//配置节
000004 CONFIGURATION SECTION.
000005 SOURCE-COMPUTER. IBM-PC WITH DEBUGGING MODE. //WITH从句指定启用调试代码。
000006 OBJECT-COMPUTER. IBM-PC.
000007 SPECIAL-NAMES.
000008 CURRENCY-SIGN IS $. //指定货币符号为"$"。
000009 DECIMAL-POINT IS COMMA. //在PIC字符串或数字字面值中交换逗号","和小数点"."的功能。
//输入输出节
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL. //命名程序所用文件,并将其与外部文件相关联。
000012 SELECT INPUT-FILE ASSIGN TO "IN.DAT".
//数据部
000013 DATA DIVISION.
//文件节
000014 FILE SECTION. //定义数据文件的结构。
000015 FD INPUT-FILE. //File Description.后面的文件名必须与前面SELECT语句中的一致。
000016 01 INPUT-RECORD-1 PIC X(100). //描述文件属性及与其关联的数据记录(可以是多个)。
000017 01 INPUT-RECORD-2 //同一存储区域的另一种定义。
重定义INPUT-RECORD-1。
000018 03 ITEM-1 PIC X(20).
000019 03 ITEM-2 PIC X(80).
//工作存储节,描述程序处理过程中所涉及的不属于文件的数据记录。
//此存储区在运行单元开始时被分配,在运行单元结束时被销毁,在此过程中将保持其最后使用值。
000020 WORKING-STORAGE SECTION.
000021 01 WORK-FIELD PIC X(20).
//连接节,用于被调用程序,描述从调用程序传递过来的数据。
000022 LINKAGE SECTION.
000023 01 LNK-FIELD PIC X(10).
//过程部,被调用程序可以包含USING从句用于接收调用程序传递的参数数据,主调程序不需要。
000024 PROCEDURE DIVISION USING BY REFERENCE LNK-FIELD. //BY REFERENCE 是默认值,可以省略。
000025 PGMNAME-START SECTION. //过程部处理逻辑的细分。
000026 PERFORM P-PROC-1-RTN.
000027 PERFORM P-PROC-2-RTN.
000028 EXIT PROGRAM. //返回调用程序(同GOBACK)。
000029 P-PROC-1-RTN SECTION.
000030 P-PROC-1.
000031 DISPLAY "first program:".
000032 P-PROC-1-EXT.
000033 EXIT. //相当于CONTINUE,其后的任何语句都会被执行。
000034 P-PROC-2-RTN SECTION.
000035 P-PROC-2.
000036 DISPLAY "HELLO, WORLD!".
000037 P-PROC-2-EXT.
000038 EXIT.
----|----1----|----2----|----3----|----4----|----5----|----6----|----7----|----8
3.标识部(IDENTIFICATION DIVISION)
PROGRAM-ID:指定程序名,其后可以加上RECURSIVE从句,表示本程序可以被递归执行。
如
PROGRAM-ID. PGMNAME RECURSIVE.
RECURSIVE只能用于一个编译单元的最外层程序,该程序不能包含嵌套子程序。
4.环境部(ENVIRONMENT DIVISION)
配置节:CONFIGURATION SECTION描述程序编译和执行的计算机环境。
SOURCE-COMPUTER:指定用于编译本程序的计算机系统名,由编译器厂商定义。
WITH DEBUGGING MODE将启用调试代码,其中"WITH"可以省略。
OBJECT-COMPUTER:指定用于运行本程序的计算机系统名。
输入输出节:INPUT-OUTPUT SECTION可以包含两个段,FILE-CONTROL和
I-O-CONTROL,后者不常用。
*文件说明:
可用的文件组织方式取决于所选用的数据存储设备:
顺序存储设备(Sequential-only Devices):终端、打印机、读卡器和打卡器被称为单元记录设备,因为它们一次只处理一行数据,所以在程序中读写此类设备时,也必须按顺序一次处理一条记录。
磁带上的记录是顺序排列的,在程序中也必须顺序处理。
处理磁带文件时使用QSAM 物理顺序文件。
磁带记录可以是定长或变长的,其数据传输速率比卡片快。
直接存取存储设备(Direct-Access Storage Devices,DASDs):此类设备提供了更大的灵活性,可以使用多种文件组织方式——Sequential (VSAM or QSAM),Line sequential (UNIX),Indexed (VSAM),Relative (VSAM)。
在用于z/OS和OS/390系统的IBM Enterprise COBOL上,向操作系统作出的对输入输出设备数据记录的存储和检索请求,由两种存取方式——QSAM和VSAM,及UNIX文件系统来处理。
QSAM(Queued Sequential Access Method):没有键的文件,其中的记录按输入顺序一条接一条排列。
程序只能顺序处理这类文件,按照记录在文件中的顺序来检索它们。
记录被创建后,不能改变其长度和在文件中的位置,也不能删除它,但可以用REWRITE更新DASDs上的QSAM文件。
QSAM文件可以放在顺序存储设备和直接存取存储设备(DASDs)上。
VSAM(Virtual Storage Access Method):用于DASDs上的文件的存取方式。
此方式可以——加载文件、从文件中检索记录、更新文件、增加/替换/删除文件中的记录。
VSAM相比QSAM有如下优势:保护数据免于未授权的访问,跨系统兼容性,独立于设备,更简洁的JCL,能使用INDEXED和RELATIVE文件组织方式。
FILE-CONTROL:将程序中的每个逻辑文件与外部数据集联系起来,并指定文件的组织、存取方式及其他信息。
可包含如下语句:([]中的词是可选的)
SELECT [OPTIONAL] INFILE ASSIGN [TO] "FILE.DAT"
ORGANIZATION [IS] *
ACCESS [MODE] [IS] *
RECORD/RELATIVE [KEY] [IS] *
ALTERNATE [RECORD] [KEY] [IS] * [[WITH] DUPLICATES]
[FILE] STATUS [IS] DATANAME1 DATANAME2.
INFILE是程序中使用的逻辑文件名,它必须在数据部文件节的FD或SD条目中被描述。
FILE.DAT可以是操作系统下的物理文件,也可以是记号名(如DD名或环境变量),可在之后利用运行时选项为其指定实际的物理文件。
OPTIONAL表示此文件不一定每次运行时都会存在。
当以只读(INPUT)或读写(I-O)方式打开此文件时,如果文件不存在,将自动创建此文件。
在没有OPTIONAL限定时,读取不存在的文件会报错。
ORGANIZATION指定文件的逻辑结构:
SEQUENTIAL:记录的次序由其在文件中的物理顺序决定,记录可以是定长或变长的,它们没有键(key)。
如果省略ORGANIZATION从句,编译器将默认文件为本类型。
INDEXED:记录的位置由随文件而建立并由系统所维护的索引来确定,索引建立在位于文件记录中的键(key)上。
每条记录都必须包含有一个作为主键(primary key)的项目,并由RECORD KEY从句来声明。
此类文件必须是DASDs上的文件,记录可以是定长或变长的。
RELATIVE:记录根据其相对于文件开头的位置来决定,文件中第1条记录的相对记录号为1,第10条记录的相对记录号为10,依次类推。
此类文件必须是DASDs上的文件,记录可以是定长或变长的。
LINE SEQUENTIAL:记录的次序由其在文件中的物理顺序决定。
每条记录以一个分隔符(换行符)结尾,分隔符不算在记录长度内。
记录写入时,尾部的空格都被删除,然后加上分隔符再写入文件。
记录读取时,如果读取的长度小于记录存储区的长度,尾部的分隔符被舍弃,剩余长度以空格填满;如果读取的长度大于记录存储区的长度,在读满记录存储区后,剩余字符将成为下一次读取的内容。
每条记录只能包含可打印字符及如下控制字符:警报(X'2F')、退格(X'16')、换页(X'0C')、换行(X'15')、回车(X'0D')、水平制表符(X'05')、垂直制表符(X'0B')、DBCS (Double Byte Character Set)shift-out(X'0E')、DBCS shift-in(X'0F'),其中换行符被当作分隔符,其它字符被当作文件记录的数据。
ACCESS MODE指定文件中的记录以何种方式可用:
SEQUENTIAL:可用于上述任一ORGANIZATION的文件。
对于SEQUENTIAL和LINE SEQUENTIAL文件,记录按照物理顺序(即记录原先被写入文件的顺序)读写;对于INDEXED 文件,记录按照键值的升序读写;对于RELATIVE文件,记录按其相对记录号的升序读写。
如果省略ACCESS从句,将默认为本方式。
RANDOM:只能用于INDEXED和RELATIVE文件。
由索引键值/相对键值指定所读写的记录,一次存取一条。
DYNAMIC:只能用于INDEXED和RELATIVE文件。
纪录可按上述两种方式读写,取决于所用输入输出语句的具体形式。
RECORD KEY用于指定INDEXED文件记录中用作主键的项目。
对于不同的记录,主键的值必须是唯一的。
RELATIVE KEY确立一个数据名,用来为RELATIVE文件的记录指定相对记录号。
它不能是数据记录的一部分,必须被定义为无符号整型,且不能包含PICTURE符号"P"。
ALTERNATE RECORD KEY替换关键字是可选的,它提供了存取INDEXED文件的另一途径。
当指定了DUPLICATES时,替换关键字的值对于不同记录必须是唯一的,如果没有指定DUPLICATES,其值可以有重复。
对于顺序存取方式,具有相同键值的记录按其被输入文件的顺序来读写;对于随机存取方式,只有第一条记录可以被检索到。
FILE STATUS监视文件每一次输入输出操作的执行。
在每一次涉及此文件的显式的或隐式的输入输出操作之后,系统都会给由FILE STATUS指定的项目设定一个值。
DATANAME1可以在WORKING STORAGE SECTION、LOCAL STORAGE SECTION或LINKAGE SECTION中定义。
它可以是2个字符的英数字或NATIONAL类别,也可以是USAGE DISPLAY或USAGE NATIONAL的2位的数字类别,且不能包含PICTURE符号"P"。
DATANAME2必须在WORKING STORAGE SECTION或LINKAGE SECTION中定义为一个拥有6个字节的英数字型组合项。
只有VSAM文件需要指定DATANAME2,它用来接收6字节的VSAM返回码。
当VSAM返回码非0时,DATANAME2被设定。
当DATANAME1的值为0时,DATANAME2的值是未定义的。
I-O-CONTROL:此段在COBOL程序中是可选的,用于指定程序的重新运行点和不同文件共享的内存区等。
由于此段很少使用,无需详细了解。
5.数据部(DATA DIVISION)
数据部以结构化的方式描述程序中处理的所有数据。
文件节:FILE SECTION描述数据文件的结构。
对于SORT/MERGE文件,必须包含一个SD 描述项,对于其它文件,必须包含一个FD描述项。
FILE SECTION.
FD FILE-NAME
[IS] EXTERNAL
[IS] GLOBAL
BLOCK [CONTAINS] INT-1 [TO INT-2] CHARACTERS/RECORDS
RECORD [CONTAINS] INT-3 [TO INT-4] [CHARACTERS]
RECORD IS VARYING IN SIZE [FROM] INT-5 TO INT-6 CHARACTERS DEPENDING [ON] INT-7
01 FILE-RECORD.
03 *.
...
FILE-NAME必须与环境部相应的SELECT从句指定的名字一致。
其后的从句都是可选可任意排列的。
EXTERNAL表明FILE-NAME是外部的。
外部文件名能让两个程序通过共享文件来通信,此文件的存储区是与整个运行单元关联的,而不是只与其中某个程序关联。
GOLBAL表明FILE-NAME是全局的。
全局文件名对声明它的程序以及直接或间接包含于该程序的每个程序都是可用的。
BLOCK CONTAINS指定物理记录的长度。
INT-1和INT-2必须为非0无符号整数,它包括物理记录中任意的控制字节和填充内容(逻辑记录不包括填充内容)。
如果记录不是分块的,此句可以省略。
CHARACTERS用来指定一条物理记录所包含的字节数,它是默认的。
RECORDS 用来指定一条物理记录所包含的逻辑记录数。
RECORD指定用于存储每条记录的字节数。
INT-3单独使用时用于定长记录;INT-3和INT-4一起使用时可用于定长或变长记录,但这种形式在任何情况下都不是必须的。
当一个文件的所有01层描述项都具有相同的长度时,将得到定长记录。
INT-7必须是无符号整型数据项。
工作存储节:WORKING-STORAGE SECTION描述不属于数据文件的数据记录,它也用于描述在源程序中被赋值并在目标文件的执行过程中保持值不变的数据项。
连接节:LINKAGE SECTION用于被调用程序,描述从调用程序传递过来的参数数据。
6.过程部(PROCEDURE DIVISION)
过程部包含程序要执行的所有语句,包括可选的DECLARATIVES和节、段、语句等。
过程部的部头格式为:
PROCEDURE DIVISION [USING [[BY] REFERENCE/VALUE] DATA-1...] [RETURNING DATA-2].
USING短语用于子程序,指定程序被调用时所接收的参数。
DATA-1...必须是LINKAGE SECTION中定义为01层或77层的数据项,但在调用程序的CALL语句的USING短语中指定的数据项可以是其数据部中定义的任意层的数据项。
DATA-1...的数据描述项中可以包含REDEFINES从句。
可以从非COBOL程序CALL COBOL程序,或者从系统命令向COBOL主程序传递用户参数。
调用程序与子程序的USING短语中的标识符是按位置而不是名字来对应的,相应的标识符必须包含相同的字节数,尽管它们的数据描述不必相同。
BY REFERENCE和BY VALUE短语作用于其后的所有参数,直到出现另一个此短语。
RETURNING短语指定一个用于接收程序结果的数据项,这是一个输出参数。
DATA-2必须是LINKAGE SECTION中定义为01层或77层的数据项。
此短语不能用于包含ENTRY语句的程序、嵌套程序和主程序。
过程部的结束由以下之一标识:
碰到嵌套程序的标识部部头。
END PROGRAM记号。
到达程序的尾部,后面再没有任何代码行了。
7.数据描述
程序中所有数据间的关系在数据部中通过层指示符和层号来定义。
层指示符(level indicator)和其描述条目一起指定了程序中的每个文件。
FD是文件描述的层指示符,SD是sort-merge文件描述的层指示符。
层号(level-number)和其描述条目一起指定了具体数据的属性。
层号包括范围[01,49]中的一位或两位整数,以及3个特殊层号:66、77、88。
基本数据项(elementary items)是数据的基本划分。
组数据项(group items)是基本数据项的组合。
组还可以组合成包含一个或多个子组的更大的组。
不带GROUP-USAGE从句的组是英数字型的组,无论其所包含的基本数据项是如何表示的。
GROUP-USAGE的用法为:
GROUP-USAGE [IS] NATIONAL.
每个组数据项和基本数据项都是一个单独的条目,都必须被赋予一个层号。
01:它是最高层,必须从A区开始。
可以是英数字型组数据项、NATIONAL组数据项或基本数据项。
02~49:可以从A区或B区开始。
层次越低的数据项被赋予越大的层号,它们之间不必是连续的。
66:必须包含一个RENAMES从句,用于重新编制前面已定义的数据项。
格式:
66 DATA-1 RENAMES DATA-2 [THROUGH/THRU DATA-3].
例1-------------------------------
01 RECORD-I
05 DN-1... .
05 DN-2... .
05 DN-3... .
05 DN-4... .
66 DN-6 RENAMES DN-1 THROUGH DN-3.
图示:
│DN-1│DN-2│DN-3│DN-4│
┕━━━DN-6━━━┙
例2-------------------------------
01 RECORD-II
05 DN-1... .
10 DN-2... .
10 DN-2A... .
05 DN-1A REDEFINES DN-1.
10 DN-3A... .
10 DN-3... .
10 DN-3B... .
05 DN-5... .
66 DN-6 RENAMES DN-2 THROUGH DN-3.
图示:
┍━━━DN-1 ━━━━┑
│DN-2 │DN-2A │DN-5 │
┍━━━DN-1A━━━━┑
│DN-3A │DN-3│DN-3B│
┕━━DN-6━━┙
77:必须从A区开始。
用于标识工作存储节或连接节中的一个独立的数据描述条目。
它不是其它项目的细分项,本身也不能细分。
88:标识与条件变量的某个特定值相关的条件名。
01 AGE-GROUP PIC 99. //条件变量(conditional variable)
88 INFANT VALUE 0. //条件名(condition name),下同
88 BABY VALUE 1, 2.
88 CHILD VALUE 3 THRU 12.
88 TEENAGER VALUE 13 THRU 19.
用法:
IF INFANT //如果AGE-GROUP的值为0
... //执行语句
数据分类:
Category
Usage
Alphabetic
Alphabetic
DISPLAY
Alphanumeric
Alphanumeric
DISPLAY
Alphanumeric-edited
DISPLAY
Numeric-edited
DISPLAY
DBCS
DBCS
DISPLAY-1
National
National
NATIONAL
National-edited
NATIONAL
Numeric-edited
NATIONAL
Numeric
Numeric
DISPLAY (type zoned decimal) NATIONAL (type national decimal) PACKED-DECIMAL (type internal decimal) COMP-3 (type internal decimal)
BINARY
COMP-4
COMP-5
Internal floating-point
COMP-1
COMP-2
External floating-point
DISPLAY
NATIONAL
数据对齐规则:
数据在基本数据项中的对齐标准取决于接收它的数据项的类型。
数字型(numeric):按假定的小数点对齐,如果需要,会发生截断或以0填充。
如果没有显式地指定小数点,则认为小数点紧接在字段的最右边。
数字编辑型(numeric-edited):按小数点对齐,如果需要,会在任意一端发生截断或以0填充。
内部浮点数(internal floating-point):小数点被假定紧接在字段的最左边,数据向左对齐,指数被相应地调整。
外部浮点数(external floating-point):数据向左对齐,指数被相应地调整。
英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型
(alphabetic)/DBCS:左对齐,如果需要,会在右端发生截断或以空格填充。
如果指定了JUSTIFIED/JUST从句,则右对齐。
national/national-edited:同上,区别是用Unicode空格(NX'0020')进行填充。
数值数据内部表示:
数值类型
PICTURE、USAGE和可选SIGN从句
值
内部表示
External decimal
PIC S9999 DISPLAY
+ 1234
F1 F2 F3 C4
- 1234
F1 F2 F3 D4
1234
F1 F2 F3 C4
PIC 9999 DISPLAY
1234
F1 F2 F3 F4
PIC S9999 DISPLAY
SIGN LEADING
+ 1234
C1 F2 F3 F4
- 1234
D1 F2 F3 F4
PIC S9999 DISPLAY
SIGN LEADING SEPARATE + 1234
4E F1 F2 F3 F4
- 1234
60 F1 F2 F3 F4
PIC S9999 DISPLAY
SIGN TRAILING SEPARATE + 1234
F1 F2 F3 F4 4E
- 1234
F1 F2 F3 F4 60
Binary
PIC S9999 BINARY
COMP
COMP-4
+ 1234
04 D2
- 1234
FB 2E
PIC S9999 COMP-5
+ 12345
30 39
- 12345
CF C7
PIC 9999 BINARY
COMP
COMP-4
1234
04 D2
PIC 9999 COMP-5
60000
EA 60
Internal decimal
PIC S9999 PACKED-DECIMAL
COMP-3
+ 1234
01 23 4C
- 1234
01 23 4D
PIC 9999 PACKED-DECIMAL
COMP-3
+ 1234
01 23 4F
- 1234
01 23 4F
Internal floating point
PIC 9999 COMP-1
+ 1234
43 4D 20 00
PIC 9999 COMP-2
+ 1234
43 4D 20 00 00 00 00 00
- 1234
C3 4D 20 00 00 00 00 00
External floating point
PIC +9(2).9(2)E+99 DISPLAY
+ 1234
4E F1 F2 4B F3 F4 C5 4E F0 F2
- 1234
60 F1 F2 4B F3 F4 C5 4E F0 F2
*内部表示为16进制表示,每个16进制字符占用4位(bits),两个16进制字符表示1个字节(byte)。
数据描述从句:
FILLER:指定程序中不被显示提到的数据项。
如果省略了数据名及FILLER,则相当于使用了FILLER。
在INITIALIZE语句中,FILLER数据项将被忽略。
BLANK WHEN ZERO/ZEROS/ZEROES:当数据项的值为零时,该项只包含空格。
只能用于数字型和数字编辑型的基本数据项,且其PICTURE字符串不包含S或*,必须被显式或隐式地描述为USAGE DISPLAY或USAGE NATIONAL。
不能用于日期字段。
JUSTIFIED/JUST [RIGHT]:右对齐。
只用于英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS/national/national-edited。
OCCURS:指定一个表(数组),其元素可以通过下标来访问,下标从1开始。
OCCURS不能用于01、66、77和88层的项目。
多维表通过嵌套OCCURS来实现,其下标格式为(m,n,k...)或(m n k...)。
格式:
OCCURS INT-1 [TO INT-2] [TIMES] DEPENDING [ON] DATA-1
ASCENDING/DESCENDING [KEY] [IS] DATA-2...
INDEXED [BY] IDX-1... .
其中,INT-2必须比INT-1大。
DEPENDING ON从句定义不定长的表。
DATA-1必须是整数数据项,其当前值代表了表中当前的元素个数。
ASCENDING/DESCENDING KEY短语指定表中的数据必须按升序或降序排列。
DATA-2...必须按其重要性的降序列出。
所有KEY的个数不能超过12个,所有KEY的长度和不能超过256。
INDEXED BY定义表的索引。
可以为一个特定的表创建索引(用INDEXED BY),此索引也可以用于其它表,只要两个表具有相同数目及相同长度的元素;也可以单独创建一个索引(用USAGE [IS] INDEX),此索引可以用于任何一个表。
例:
05 TABLE-ITEM PIC X(8) OCCURS 10 INDEXED BY INX-A.
77 INX-B USAGE IS INDEX.
PERFORM VARYING INX-B FROM 1 BY 1 UNTIL INX-B > 10
DISPLAY TABLE-ITEM(INX-B)
END-PERFORM.
PICTURE/PIC [IS]:指定基本数据项的一般特征和编辑要求。
PICTURE从句不可用于INDEX 数据项、RENAMES主语、POINTER和内部浮点数。
picture符号的含义:
A:容纳一个拉丁字母或空格。
占据数据项大小中的一个字符位。
B:容纳一个空格。
占据数据项大小中的一个字符位。
E:标示外部浮点数中指数的起点。
占据数据项大小中的一个字符位。
G:一个DBCS字符。
占据数据项大小中的一个字符位。
N:一个DBCS字符或NATIONAL字符。
占据数据项大小中的一个字符位。
P:指定假定的十进制缩放位置,不计入数据项大小。
只能在picture字符串的最左边或最右边指定一串连续的P。
例:PPP999的值范围为0~.000999,S999PPP的值范围为-999000~-1000、0、1000~999000。
S:正负号指示符,不计入数据项大小,如果指定了SIGN ... SEPARATE,则占据数据项大小中的一个字符位。
S只能是picture字符串最左边的一个字符。
V:指定假定小数点的位置,不计入数据项大小。
当小数点位于picture字符串最右边时,V是多余的。
V只能在给定的picture字符串中出现一次。
X:容纳计算机英数字符集中任意一个被允许的字符。
占据数据项大小中的一个字符位。
Z:代表一个先头数字字符位,当该位为0时,将用空格代替。
占据数据项大小中的一个字符位。
9:一个数字。
占据数据项大小中的一个字符位。
0:数字0。
占据数据项大小中的一个字符位。
/:斜杠。
占据数据项大小中的一个字符位。
,:逗号。
占据数据项大小中的一个字符位。
.:一个编辑字符,代表用于对齐的小数点。
另外也代表一个句号位,占据数据项大小中的一个字符位。
+、-:用于编辑项的正负号控制符。
占据数据项大小中的一个字符位。
"+"表示对于正值将输出"+"表示正数,负值将输出"-"表示负数;"-"表示对于正值将输出空表示正数,负值将输出"-"表示负数。
*:代表一个先头数字字符位,当该位为0时,将用*代替。
占据数据项大小中的一个字符位。
紧跟在其中任一符号后的括号内的无符号非0整数表示该符号连续出现的个数。
REDEFINES:用不同的数据描述条目描述同一块计算机内存区域。
格式:
level-number [DATA-1/FILLER] REDEFINES DATA-2.
DATA-1及其下级项不能包含VALUE从句。
DATA-2的描述项可以有REDEFINES从句,不可以有OCCURS从句,但DATA-2可以是OCCURS数据项的下级项。
DATA-1和DATA-2必须具有相同级别,但层号不必相同,且不能是66或88。
DATA-1的长度可以比DATA-2的长度大,这不会改变DATA-2的长度。
如果A REDEFINES B. 则MOVE A TO B 和MOVE B TO A 的结果可能是未定义的。
SIGN:为带符号数字项指定运算符的位置和表现形式。
格式:
[SIGN [IS]] LEADING/TRAILING [SEPARATE [CHARACTER]].
该从句只能用于一个用语为DISPLAY或NATIONAL且其picture字符串中包含S的基本数字数据项,或者至少包含一个此类数据项的组数据项。
当用于后者时,SIGN从句只作用于组中包含的如前者的数据项,其它数据项将不受此从句影响。
USAGE NATIONAL必须包含SEPARATE 短语。
SYNCHRONIZED:指定基本数据项在内存的自然边界上的对齐方式。
可用于基本数据项和01层组数据项。
格式:
SYNCHRONIZED/SYNC [LEFT/RIGHT].
USAGE:指定数据在内存中的表示格式。
可用于除66和88外的任意层次的数据描述条目。
组数据项的USAGE将作用于组内每一个基本数据项。
当USAGE没有被显式地指定时,将默认为如下的USAGE:
DISPLAY:当PICTURE从句只包含G、N以外的符号。
NATIONAL:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(NATIONAL)有效。
DISPLAY-1:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(DBCS)有效。
计算项(computational items)用于算术运算,必须是数字型。
其最大长度为18位数,除了PACKED-DECIMAL项外。
如果编译器选项ARITH(COMPAT)有效,PACKED-DECIMAL的最大长度为18位数;如果ARITH(EXTEND)有效,则PACKED-DECIMAL的最大长度为31位数。
其PICTURE字符串只能包含:9、S、V、P。
COMP-1和COMP-2不能有PICTURE 字符串。
计算项包括以下用语(COMP是COMPUTATIONAL的缩写,二者等价):
BINARY:二进制数据项。
负数用其绝对值的2的补码表示。
所占内存取决于其PICTURE从句中定义的十进制数的个数。
位数:内存:
1~4 2个字节
5~9 4个字节
10~18 8个字节
二进制数是big-endian的,运算符包含在最左边的位上。