序号 数据名 PIC 数据类型 [VALUE 值].
例:03 MY-ID PIC 999 [VALUE 123]. 数据类型写几个长度就是几。
9:数值型,99999 缩写 9(5),不满位前补0, 0有(+)符号。
S:正负数值,S9999 缩写 S9(4),不满位前补0,值有正负符号。
V:小数,99V999 缩写 9(2)V9(3),正数前补0,小数后补0,输出不显示小数点
P:固定值0,P99 缩写 P(2),P代表固定数值0
Z:数值型占位,ZZZ99 缩写 Z(3)9(2),不满位Z位补半角空格
A:字母形,AAA 缩写 A(3),不满位后补半角空格,只能存(a-zA-Z)和半角空格
X:字符型,XXX 缩写 X(003),不满位后补半角空格,只能存半角的(文字字母数值符号)
N:全角字符,NNN 缩写 N(003), 不满位后补半角空格,可以存全角或半角文字。
$999 缩写 $9(3),例:$123
99.99 缩写 9(2).9(2),例:12.34 ,DISPLAY输出有小数点
S99,999,999 缩写 S9(2),9(3),9(3),例如:+12,345,678
ZERO:1个以上0,99→00,9V9→00,9.9→0.0,A→不可赋0,X(2)→'00',N(2)→'0000'
SPACE:1个以上半角空格, 99,9V9,9.9→数值不可赋值空格, AA→' ',XX→' ', NN→' '
LOW-VALUE:1个以上最小值, 99,9V9,9.9→数值不可赋值, A(2),X(2)→2*low, N(2)→4*low
HIGH-VALUE:1个以上最大值, 99,9V9,9.9→数值不可赋值, A(2),X(2)→2*HIGH,N(2)→4*HIGH
ALL 字符:1个以上该字符,
注释:ZEROS,SPACES等与上记含义相同,表意常量不赋予数据时直接输出长度为1,LOW-VALUE输出看起来像SPACE,实际两个值不相等。
03 NUM-1 PIC 999 VALUE 123.
注释:常量只是初期了值的变量,形式上不对其值改变,实际可以改变它的值。数值常量最多18位
03 STR-1 PIC XXX VALUE 'abc'.
注释:用引号括起来的字符,单双引号同样, 字符最多160个
03 NUM-2 PIC 999 COMP VALUE 123.
注释:二进制型,只能对数值使用,全称COMPUTATONAL,将通常存储的4bit数值以2bit存储,无法通过输出人为确认,只能用于机器识别。
单目标传送:MOVE A TO B. // 将A赋值给B
多目标传送:MOVE A TO B,C. // 将A赋值给B和C
注释:元数据长度不足,不保留目标的数据值
[9 | X] TO 9:从右向左依次赋值,不足左补0,超出左截掉
[9 | X] TO 9V9:元数据(无点)从右向左个位开始赋值,小数默认为0,不足左补0,超出左截掉
9V9 TO 9V9:整数从右向左赋值,小数从左向右赋值,不足两侧补0,超出两侧截掉。
[9 | 9V9 | X] TO X:由左向右赋值(不含数值正负号,V不含点,9.9含小数点)不足后补空格,超出后截掉。
[X | A] TO A:由左向右赋值,不足后补空格,超出后截掉
注释:可赋值给A的值与X同效果。只有9V9和9.9相互之间可以给小数赋值,9V9不存点所以赋值目标9AX也不含点。
(1) A 不可给 9, S9, 9V9, 9.9等数值类型赋值。
(2) A 不可接收 9, S9, 9V9, 9.9等数值类型的赋值。
(3) S9 赋值给其他类型,数值的负号变正号。
注释:避免字符X给9赋值 数值以外的值,赋值可正常编译运行,打印会变符号。
截元数据给目标:MOVE A(开始位 : 长度) TO B // 按目标B补位,字符右补空额或截取,数值左补0或截取。
数据给目标对应位数:MOVE A TO B(开始位 : 长度) // 将目标对应位数当字符,不足右补空格或超出右截取,对指定的目标范围外的数据无影响。
注释:全角占2位,截取全角(应该从单数开始,避免半位),元数据双数开始默认前面加1位,目标数据不可用双数位截取。
(1) 初期化:INITIALIZE WORK-AREA. // 将数值初期化为0,字符初期化为空格
注释:未初期化的数据都是LOW-VALUE(包括数值型)
(2) 占位:FILLER
注释:INITIALIZE无法初期化FILLER项目
(3) 含FILLER项目的初期化:
注释:MOVE SPACE 先将所有项目赋值为空格,INITIALIZE将数值项目初期化为0
(1) COMPUTE A = A1 + A2 + A3. (ADD A1, A2, A3 GIVING A.) (ADD A2, A3 TO A1 GIVING A.)
(2) COMPUTE A = A + B. ( ADD B TO A )
(1) COMPUTE A = A1 - A2 - A3. (SUBTRACT A2, A3 FROM A1 GIVING A.)
(2) COMPUTE A = A - B. (SUBTRACT B FROM A.)
(1) COMPUTE A = A1 * A2 * A3. (MULTIPLY A2, A3 BY A1 GIVING A.)
(2) COMPUTE A = A * B. (MULTIPLY B BY A.)
(1) COMPUTE A = A1 / A2 / A3.
(DIVIDE A1 BY A2,A3 GIVING A.) (DIVIDE A2,A3 INTO A1 GIVING A)
(2) COMPUTE A = A / B. (DIVIDE A BY B. DIVIDE B INTO A.)
(1) DIVIDE A2 INTO A1 GIVING A REMANDER B. // a=a1/a2. b=a1%a2
(2) DIVIDE A1 BY A2 GIVING A REMANDER B. // a=a1/a2. b=a1%a2
注释:余算不能用COMPUTE计算。GIVING后不能是常量,无GIVING则将值赋值给TO后变量
加减算中间值:整数位数=两个数最大整数位+1,小数=最长小数位数(1.2+34.56 > 000.00)
乘算中间值:整数=两个数整数相加,小数=两个数小数相加 (1.2*34.56 > 000.000)
除算中间值:整数=左侧整数+右侧小数,小数=计算式中最长小数 (34.56/1.2 > 000.00)
大于 ( > ),关键字 大于 ( IS GREATER THAN )
小于( < ),关键字 小于 ( IS LESS THAN )
大于等于( >= ),关键字 不小于 ( NOT LESS THAN )
小于等于( <= ),关键字 不大于 ( NOT GREATER THAN )
等于( = ),关键字 等于 ( IS EQUAL TO )
不等( NOT = ),关键字 不等 ( NOT EQUAL TO )
变量或表达式 是正数 (A IS POSITIVE )(表达式 IS POSITIVE)
变量或表达式 是负数 (A IS NEGATIVE )(表达式 IS NEGATIVE )
变量或表达式 是0 (A IS ZERO )(表达式 IS ZERO)
变量或表达式 不是0 (A IS NOT ZERO )(表达式 IS NOT ZERO)
是数值: IS NUMERIC
不是数值:IS NOT NUMERIC
是字母:IS ALPHABETIC
不是字母:IS NOT ALPHABETIC
注释:9型不可用ALPHABETIC判断,
X型空格字母IS ALPHABETIC得到true(LOW-VALUE,1,A1)得到false
X与9型 值是0-9 IS NUMERIC 得到true(LOW-VALUE, 1,A1,空格)得到false
9型,不能与LOW-VALUE判断,需要给外层加一个没有类型的层级,可以判断外层。
定义未初期化的值是LOW-VALUE
优先级:NOT > AND > OR
(1) IF 条件 语句.
(2) IF 条件1 IF 条件2 语句.
(3) IF 条件 语句(可嵌套IF...END IF) ELSE 语句 END IF.
注释:IF条件以点结束,只有最外层IF可以用点结束,条件可以用AND,OR连接,IF A=B OR C (if a=b or a=c)
(1) 单字段,单判断:EVALUATE 变量 WHEN 常量 语句 ...WHEN OTHER 语句 END EVALUATE.
(2) 单字段,多判断:EVALUATE 变量 WHEN 常量 WHEN 常量 语句 ... END EVALUATE.
(3) 多字段,判断:EVALUATE 变量 ALSO 变量 WHEN 变量 ALSO 变量 语句... END EVALUATE.
注释:传值与判断的变量与常量可以互换,ALSO可以加多个,引数与条件个数与顺序必须一致。
(1) 外PERFORM
- MAIN-RTN.
- //1
- PERFORM FOR1-RTN THRU FOR1-END.
- //3
- PERFORM FOR2-RTN.
- PERFORM STOP-RTN.
- MAIN-EXT.
-
- FOR1-RTN
- //2
- GO TO FOR1-END.
- FOR1-END.
- EXIT.
-
- FOR2-RTN.
- //4
- GO TO FOR2-END.
- FOR2-END.
- EXIT.
-
- STOP-RTN.
- //5
- STOP RUN.
- STOP-END.
- EXIT
注释:有THRU会使GOTO正常返回执行,没有THRU的GOTO会使程序混乱。
EXIT 可以是没有GOTO的不加THRU的过程正常终止。
CONTINUE 和 NEXT SENTENCE相当于没有代码继续执行。
(2) 内PERFROM
- PRO-RTN.
- 处理...
- PERFORM
- 处理...
- END-PERFORM.
- 处理...
- PRO-EXT.
- EXIT.
注释:内PERFORM主要用于循环
(1) UNTIL终止循环方式
方式1:UNTIL 后跟表达式例如(A > 2)( NUM = 0 )
方式2:UNTIL 后跟88层变量 ( UNTIL RTN-E) 相当于判断 RTN-S = 9
- 77 RTN-S PIC 9 VALUE 0.
- 88 RTN-E VALUE 9.
(2) 先判断后执行
PERFORM 过程-S THRU 过程-E WITH TEST BEFORE UNTIL 条件.
注释:可省略 WITH TEST BEFORE,先判断UNTIL后条件,满足则不执行循环。
(3) 先执行后判断
PERFORM 过程-S THRU 过程-E WITH TEST AFTER UNTIL 条件.
注释:先执行过程,后判断条件,满足则不再循环第二次。
(4) 内循环
PERFORM UNTIL 条件 处理... END-PERFORM.
(1) 外循环
指定循环次数:PERFORM 过程-S THRU 过程-E 整数变量 TIMES.
注释:过程执行中变数变化不影响循环次数,
(2) 内循环
指定循环次数:PERFORM 整数变量 TIMES 处理... END-PERFORM.
(1) 外循环
PERFORM 过程-S THRU 过程-E VARYING 变量 FROM 初值 BY 步长 UNTIL 条件.
注释:循环过程,变量的开始值是初值,每次循环加步长,直到满足UNTIL条件退出循环。
(2) 内循环
PERFORM VARYING 变量 FROM 初值 BY 步长 UNTIL 条件 处理... END-PERFORM.
- PERFROM POR1-RTN THRU POR1-EXT
- VARYING 变量1 FROM 初值1 BY 步长1 UNTIL 条件1
- AFTER 变量2 FROM 初值2 BY 步长2 UNTIL 条件2
注释:变量1的循环套变量2的循环。
外部文件
- PROGRAM-ID xxx001
-
- DATA DIVISION.
- LINKAGE SECTION.
- 01 数据 PIC 9.
- 01 数据 PIC 9.
-
- PROCEDUE DIVISION [USING 数据1, 数据2]
- 处理...
- EXIT PROGRAM.
自身文件
(1) 指定子程序名,子程序没有参数可写USING 和参数,参数个数与顺序必须一致。默认引用传递
- 过程-S
- 处理...
- CALL 'xxx001' USING 引数1, 引数2
(2) BY CONTENT 值传递
- 过程-S
- 处理...
- CALL '子程序名' USING BY CONTENT 引数1, 引数2
- 01 A
- 03 AA
- 05 A1 PIC 9.
- 05 A2 PIC 9.
- 05 A3 PIC 9.
注释:外部文件只有数据结构,没有部节等信息。
- 子过程-S
- 处理...
- 子过程-E
- EXIT.
注释:外部过程文件只有过程,没有部节信息。
- DATA DIVISION.
- COPY 外部数据文件名.
- COPY 玩不数据文件名 REPLACINT 别名-.
-
- PROCEDUE DIVISION.
- MOVE A1 TO XX.
- MOVE 别名-A1 TO XX.
- PROCEDUE DIVISION.
-
- 过程...
- PERFORM 子过程-S.
- 过程...
-
- COPY 子过程文件名.
- 03 YMD.
- 05 YMD-YYYY PIC 9(4).
- 05 YMD-MM PIC 9(2).
- 05 YMD-DD PIC 9(2).
- 03 YMD-2 REDEFINES YMD.
- 05 YMD-2-YYYYMM PIC X(6).
- 05 YMD-2-DD PIC X(2).
注释:重定义共享内存地址,一个质变了影响另一个值,不能用在文件节01层,可用在数据单元节01层,层号必须相同,长度相同,重定义子句不能赋初值。
- 03 A
- 05 YEAR PIC 9(4).
- 05 MONTH PIC 9(2).
- 05 DAY PIC 9(2).
- 03 B
- 05 NAME PIC X(20).
- 05 AGE PIC 9(2).
-
- 66? C REANME A.?
- 66? D REANME DAY TO NAME.?
注释:必须在数据部最后定义重命名,只能是xx层,共享内存数据,可以夸层级指定数据范围。
- DISPLAY XXX.
- DISPLAY 'abce'.
- DISPLAY 'abce' XXX.
不能将OCCURS(表,数字)定义在01,66,77,88层
(1) 表名 OCCURS 长度 [TIMES] PIC 数据类型.
(2) 表名 PIC 数据类型 OCCURS 长度 [TIMES].
- 01 OC1-TABLE.
- 03 ROW-T1 OCCURS 5 TIMES PIC 9(02).
- 03 ROW-T1 OCCURS 5 PIC 9(02).
- 01 OC2-TABLE.
- 03 ROW-T1 PIC 9(02) OCCURS 5 TIMES.
- 03 ROW-T1 PIC 9(02) OCCURS 5.
(1) 表名 OCCURS 长度 [TIMES].
- 01 OC3-TABLE.
- 03 ROW-T3 OCCURS 3 TIMES.
- 05 T-YYYY PIC X(4).
- 05 T-MM PIC X(2).
- 03 ROW-D3 OCCURS 3.
- 05 R-DATA1 PIC X(2).
- 05 R-DATA2 PIC X(3).
表名 OCCURS 最小整数 TO 最大整数 [TIMES] DEPENDING [ON] 9型数据
- 01 OC4-TABLE.
- 03 ROW-T4 OCCURS 1 TO 3 TIMES DEPENDING ON CST-N3.
- 07 OC4-R-T1 PIC X(2).
- 03 ROW-D4 OCCURS 1 TO 3 TIMES DEPENDING CST-N3.
- 07 OC4-R-D1 PIC X(2).
- 03 ROW-E4 OCCURS 1 TO 3 DEPENDING CST-N3.
- 07 OC4-R-E1 PIC X(2).
注释:根据9型数据的变化,表的长度同时变更,需要在指定表之前指定9型数据的值。
方式1:初期化表的外层数据型
方式2:VALUE IS指定外层初期値
方式3:表外层重定义有值数据
方式4:循环元素,挨个赋值
- DATA DIVISION.
- 01 OC1-TABLE.
- 03 ROW-T1 OCCURS 5 TIMES PIC 9(02).
-
- 01 OC2-TABLE VALUE IS ZERO.
- 03 ROW-T2 OCCURS 5 PIC 9(02).
-
- 01 OCA-TABLE.
- 03 FILLER PIC X(20) VALUE ALL 'A'.
- 01 OC3-TABLE REDEFINES OCA-TABLE.
- 03 ROW-T3 OCCURS 3 TIMES.
- 07 T-YEAR PIC X(4).
-
- 01 OC4-TABLE.
- 03 ROW-T4 OCCURS 3 TIMES.
- 07 T-YYYY PIC X(04).
-
- PROCEDURE DIVISION.
- MAIN-RTN.
- INITIALIZE OC1-TABLE.
-
- MOVE ZERO TO IDX.
- PERFORM UNTIL IDX > 2
- INITIALIZE ROW-T4(IDX).
- ADD 1 TO IDX
- EDN-PERFORM.
- MAIN-EXT.
- EXIT.
MOVE 表名(下标) TO XX.
注释:下标从1开始
MOVE 属性名 OF 表名(下标) TO XX.
- FILE-CONTROL
- SELECT 文件别名 ASSIGN 源文件名 ORGNIZATION IS SEQUENTIAL
- FILE SECTION.
- FD 文件别名 RECORD 行字节数 CHARACTERS.
- 01 文件行名-REC.
- 03 文件列名1-DATA PIC X(列长度).
- 03 文件列名2-CRLF PIC X(换行长度2).
- WORKING-STORAGE SECTION.
-
- // 方式1:内部数据结构定义
- 01 WREC.
- 03 列1 PIC 9(1).
- 03 列2 PIC 9(2).
-
- // 方式2:外部数据结构引入
- COPY 外部数据结构文件名 [REPLACING 别名].
-
注释:需要在工作单元节正常数据模型的最后引入外部的数据模型
- OPEN INPUT 文件别名.
-
- READ 文件别名 INTO 别名-WREC // 读一行数据,给数据结构
- AT END // 当读不到数据,执行下一行代码
- MOVE 9 TO XX-STATUS // 将文件状态设置为9(为了判断终止)
- [GO TO END]
- END READ.
-
- IF 文件列名-CRLF = X'0D0A' // 判断换行符
- CONTINUE
- ELSE
- 异常处理
- END-IF.
-
- CLOSE 文件别名.
- FILE-CONTROL.
- SELECT 文件别名 ASSIGN 源文件名 ORGANIZATION IS LINE SEQUENTIAL.
- FILE SECTION.
- FD 文件别名 RECORD 数据长度 CHARACTERS.
- 01 文件行-REC PIC X(数据长度)
- WORKING-STORAGE SECTION.
- // 方式1:内部定义
- 01 WREC.
- 03 列1 PIC 9(1).
- 03 列2 PIC 9(2).
-
- // 方式2:外部引用
- COPY 外部文件名 [REPLACING 别名].
- OPEN OUTPUT 文件别名.
-
- WRITE 文件行-REC FROM 别名-WREC.
-
- CLOSE 文件别名.
- EXEC SQL BEGIN DECLARE SECTION END-EXEC.
- 01 SQL1-VAR.
- 03 SQL1-DATA.
- 05 NAME PIC X(10). // 查询字段
- 05 AGE PIC 9(02).
- 03 SQL1-WHERE
- 05 CODE1 PIC A(10). // where条件
- 03 SQL-1-IND.
- 05 NAMEI PIC X(10). // 非空标识想买
- EXEC SQL END DECLARE SECTION END-EXEC.
- // 本地文件
- MOVE XX TO CODE1.
-
- // SQL文件
- EXEC SQL
- SELECT 项目1
- INTO :NAME,
- :AGE
- FROM 表名
- WHERE 项目2= :CODE1
- END-EXEC.
注释:COBOL查询不能处理多条检查结果,单条结果可以用查询,多条结果用游标
- // 定义打开游标
- CUR1-OPEN-RTN
- EXEC SQL DECLARE 游标名 CURSOR FOR
- SELECT 项目
- FROM 表名
- WHERE 项目2 = :CODE1
- END-EXEC.
- CUR1-OPEN-EXT.
- EXIT.
-
- // 定义游标赋值
- CUR1-FETCH-RTN.
- MOVE -1 TO NAMEI. // 初始化空项目判断项目
-
- EXEC SQL
- FETCH 游标名 INTO :NAME :NAMEI, AGE
- END-EXEC.
-
- IF NAME1 = -1 // 判断项目是否为空,数据库为NULL则不赋值
- MOVE LOW-VALUE TO NAME.
- CUR1-FETCH-EXT.
- EXIT.
-
- // 定义关闭游标
- CUR1-CLOSE-RTN.
- EXEC SQL CLOSE 游标名 END-EXEC.
- CUR1-CLOSE-EXT.
- EXIT.
- WORKING-STORAGE SECTION.
- ...
- EXEC SQL
- COPY 数据模型文件
- END-EXEC.
-
- PROCEDUE DIVISION.
-
- MAIN-RTN.
- * 打开游标
- PERFORM CUR1-OPEN-RTN THRU CUR1-OPEN-EXT.
- * 循环游标
- PERFORM CUR1-FETCH-RTN THRU CUR1-FETCH-EXT UNTIL XX.
- * 关闭游标
- PERFORM CUR1-CLOSE-RTN THRU CUR-CLOSE-EXT.
- MAIN-EXT.
- EXIT.
-
- XXX-XX SECTION. //自定义节
- EXEC SQL
- COPY SQL文件
- END-EXEC.
- XXX-INSERT-RTN.
- EXEC SQL
- INSERT INTO 表
- VALUES
- (:NAME,
- :AGE)
- END-EXEC.
- XXX-INSERT-EXT.
- EXIT.
- XXX-UPDATE-RTN.
- EXEC SQL
- UPDATE 表
- SET
- 项目名 = :NAME,
- 项目名 = :AGE
- WHERE 项目名 = :CODE1
- END-EXEC.
- XXX-UPDATE-EXT.
- EXIT.
- * 标识部 必须 //定义作成者,时间等信息
- IDENTIFICATION DIVISION.
- ...
-
- * 环境部 //用于指定输入输出文件
- ENVIRONMENT DIVISION.
- ...
-
- * 数据部 // 用于定义变量,引入外部变量
- DATA DIVISION.
- ...
-
- * 过程部 // 用于写程序逻辑,引入外部过程
- PROCEDUE DIVISION.
- ...
- * 标识部
- IDENTIFICATION DIVISION.
- * 必须写
- PROGRAM-ID 程序ID.
- AUTHOR 作成者.
- DATE-WRITTEN 程序编写日期.
- DATE-COMPILED 程序编译日期.
- INSTALLATION 计算机场所.
- SECURITY 计算机保密程度(例:HIGH).
- * 环境部
- ENVIRONMENT DIVISION.
-
- * 配置节 必须写 内有2个段
- CONFIGURATION SECTION.
- SOURCE-COMPUTER 源计算机(编译程序系统).
- OBJECT-COMPUTER 目标计算机(执行程序系统).
-
- * 输入输出节 有文件操作则必须写 内有2个段
- INPUT-OUTPUT SECTION.
- * 文件控制(提供程序中使用的外部数据)
- FILE-CONTROL.
- * 按行读取或写出数据
- SELECT 文件别名 ASSIGN 源文件名 ORGANIZATION IS LINE SEQUENTIAL.
- * 按位读取或写出数据
- SELECT 文件别名 ASSIGN 源文件名 ORGANIZATION IS SEQUENTIAL.
-
- * IO控制
- IO-CONTROL.
- * 数据部
- DATA DIVISION.
- * 文件节(用于定义文件结构)
- FILE SECTION.
- * 按行读类型数据
- FD 数据名 RECORD 行长度 CHARACTERS.
- 01 行名 PIC 数据类型(长度).
-
- * 按位读类型数据
- FD 数据名 RECORD 行长度 CHARACTERS.
- 01 行名.
- 03 行名-DATA PIC 数据类型(长度).
- 03 行名-CRLF PIC X(2).
-
- * 工作单元节
- WORKING-STORAGE SECTION.
- * 孤立数据项目
- 77 单项目 PIC 类型.
- * 判断初始值
- 77 判断项目 PIC 类型 VALUE 0.
- * 判断结果值
- 88 判断结果 VALUE 9.
- * 组合项目,以01~49数字开头
- 01 组合项目.
- 03 组合项目1 PIC 类型.
- 03 子组合项目.
- 05 子组合项目1 PIC 类型.
-
- * 本地存储节(每次程序开始都会初始化)
- LOCAL-STORAGE SECTION.
-
- * 连接节(外部数据接收数据名称)
- LINKAGE SECTION.
注释:77层变量,可以直接 set 变量名 to true; 将88层设置为真值
- * 过程部
- PROCEDURE DIVISION.
-
- MAIN-RTN.
- ...
- PERFORM PRO1-RTN.
- * 整个程序结束
- STOP RUN.
- MAIN-EXT.
- EXIT.
-
- PRO1-RTN.
- ...
- PRO1-EXT.
- EXIT.
coble识别:0-9 a-z A-Z +-*/,.$;'()<>:'=空格(78个字符和空格)
标识区(1-6)
换行区(7)
A区(8-11)
B区(12-72)
注释区(73-80)
数据命名 1-30个字符(只能是字母数字连接符)
gnucobol工具
cobol2002保存文件自动编号
vscode可以编写代码。