cobol基本语法.docx
《cobol基本语法.docx》由会员分享,可在线阅读,更多相关《cobol基本语法.docx(17页珍藏版)》请在冰豆网上搜索。
cobol基本语法
基本語法
、COBOL基本語法
cobol的书写格式(每行)
1、前6列为序号区(一般不编辑)
2、第7列为标示列,仅可以写如下几个标示符。
a.“*”注释符(注释当前行的代码)b“-“字符串连接符
3、第8列---11列为A区,包括以下内容。
a部、节名。
b层号01
4、第12列---72列为B区,过程部的程序必须写在B区中。
5、第72以后部分不能编辑。
、cobol的语法结构(几大部分)
1、标示部(IDENTIFICATIONDIVISION):
提供程序的一般性文档说明
2、环境部(ENVIRONMENTDIVISION):
提供程序外部有关的项目。
a.配置节(CONFIGURATIONSECTION)
①.指定源计算机(SOURCE-COMPUTE).
②.目标计算机(OBJECT-COMPUTE).
b.输入输出节(INPUT-OUTPUTSECTION).文件的物理路径的定义。
方法二:
(过程部中动态指定文件)
SELECT-FILE
SELECTFILE-LOGASSIGNTO
ORGANIZATIONISLINESEQUENTIAL.在数据部定义字符串变量SELECT-FILE,在文件FILE-LOG打开前动态指定文件路径。
3、数据部(DATADIVISION)。
程序中的变量都在数据部中定义,Cobol中没有全局变量和局部之分。
(变量的类型结构参照5.变量类型)
a.文件节(FILESECTION)
给环境部定义的文件指定一个RECORD变量,读写文件用:
FDFILE-LOG.
01RECORD-LOGPICX(2000).
b.工作存储节
定义程序中用到的临时变量。
a)COBOL变量定义需要加层号(表示层次关系),
•层号从01开始
如:
01IPICX(10).
•组合项
如:
01WORK-AREA.
05NUM-1PIC9(09).
05STR-1PICX(10).
b)层号依次排列顺序为:
01,05,10,15,20,30
c.连接节
子程序的参数的定义。
4、过程部(PROCEDUREDIVISION)
程序的主体:
程序的逻辑运算在此操作。
a、每个程序分为四大节(模块),
•前处理(初始化变量,设定初始值等)
-主处理(程序业务处理部分)
-后处理(程序正常结束时的岀口)
-错误处理(程序异常结束时的岀口)
b、对于子程序,PROCEDUREDIVISION后应列岀LINK节中定义的参数。
女口:
PROCEDUREDIVISIONUSINGLINK-INPUT-DATALINK-OUTPUT-DATA.
c、程序结束。
-主程序STOPRUN.
-子程序GOBACK.
5、变量类型
COBOL程序的基本变量类型分为两大类字符串型(X)、数值型(9)。
a字符串型
01STRING-APICX(100).
100个字符长的变量,程序可以局部操作一个变量(STRING-A(start:
length)女口:
MOVEALLX”TOSTRING-A(2:
10)
(将变量STRING-A第2位开始10长度的内容全赋为”X”字符)
b数值型
种类
类型
说明
备注
DISPLAY
9(m)
无符号整数,每位占用一个字节,显示或输岀到文件时,为零的数位显示”0”
(1<=m<=18)
例如:
01IPIC9(8).
变量I占用8个字节。
I=1时,输出显示时为00000001
S9(m)
带符号整数,每位占用一个字节,
符号位不占位,显示时,为零的数位显示”0”,符号显示在最后,输岀到文件时,为零的数位显示”0”,符号丢失。
(1<=m<=18)
例如:
01IPIC9(8).
变量I占用8个字节。
I=1时,显示时为00000001+
输出到文件时为00000001
DISPLAY
9(m)V9(n)
无符号小数(小数点不显示,不占位)每位占用一个字节,显示或输岀到文件时,为零的数位显示”0”
(1<=m+n<=18)
例如:
01IPIC9(4)V9
(2).
变量I占用6个字节,整数位4位,小数位2位。
I=1.1时,输出显示时为000110
S9(m)V9(n)
带符号小数(小数点不显示,不占位)每位占用一个字节,符号位不占位,显示时,为零的数位显示””符号显示在最后,输岀到文件时,为零的数位显示””,符号丢失。
(1<=m+n<=18)
例如:
01IPIC9(4)V9
(2).
变量1占用6个字节,整数位4位,小数位2位。
I=1.1时,显示时为000110+
输出到文件时为000110
Comp,comp-5,comp-3
9(m)comp-5
无符号整数,数据以二进制方式存贮,显示和9(m)一样,不能出力
(1<=m<=18)
S9(m)comp-5
有符号整数,数据以二进制方式存贮,显示和S9(m)类似,只是符号在前面,不能出力,
(1<=m<=18)
9(m)v9(n)comp-5
无符号小数,数据以二进制方式存
贮,显示和9(m)v9(n)一样,不能
岀力
(1<=m+n<=18)
S9(m)v9(n)comp-5
有符号整数,数据以二进制方式存
贮,显示和S9(m)v9(n)类似,只
是符号在前面,不能岀力,
(1<=m+n<=18)
注:
1、对于岀力型数值变量,可以用9代替Z,它们的区别是:
结果为零的整数部高位,小数部低位:
Z型变量用空格显示,9型变量用零显示
2、COBOL语言中数值型变量种类很多,针对不同的要求有不同的数值类型。
c、在COBOL变量定义时,可以加入格式字符串字符。
d、不同类型变量间赋值。
整数
1、字符串中数值部分可以作为对应长度的DISPLAY型变量给其它各种数值型变量。
2、DISPLAY型变量(包括岀力型变量)被赋值时,超岀它表示范围的数可以被接受,但截去超岀的高位。
3、COMP型变量被赋值时,超岀它表示范围的数不能被接受。
小数
1、DISPLAY型变量(包括岀力型变量)被赋值时,超岀它表示范围的数可以被接受,但整数部截去超岀的高位,小数部截去低位。
2、COMP型变量被赋值时,整数部超岀它表示范围的数不能被接受,小数部超岀它表示范围的数可以被接受,但小数部截去低位
注:
以上所述赋值变量为任何类型的数值型变量(经过严格测试得岀结论)。
e、字符型比较。
•字符串比较时,系统自动截去尾部空格(如a“=a”)。
•数字的数值形式和数字字符形式相等(如1234567890”=1234567890)
•综合以上两点,有“12“=12基本语法:
1、赋值语句MOVE。
a、将一个变量赋给另个变量
moveatob.
b、将一个变量同时赋给另外两个变量。
Moveatobc.
c将一个变量全部赋为某个字符
moveall“x”toa.
d、对于赋值溢出,截取的方式为.
•字符型变量截去左边的溢出部分。
•数值型变量截去整数部高位、小数部低位的溢出部分。
e、组和项传送,它们的数据结构必须相同
f、对于组合项成员的局部引用,应该如下:
01A-AREA.
05
STR-1
PIC
X(10).
05
STR-2
PIC
X(10).
1
B-AREA.
05
STR-1
PIC
X(20).
05
STR-2
PIC
X(10).
MOVE
STR-1
OFA-AREA(1:
4)TOSTR-1OFB-AREA(1:
4)
3、四则运算
原则上,四则运算不用助记符语句,但对于简单运算(++,--),可采用助记符语句
a、加法(ADD1TONUM-1)
b、减法(SUBTRACT1FROMNUM-1)
c、其它所有运算均采用COMPUTE语句
COMPUTENUM-1=NUM-2+NUM3*10
运算符如下:
+加
-减
*乘
/除
**指数
在COMPUTE语句中,变量和运算符间至少留有一个空格。
4、重定义语句REDEFINES(数据部中使用)
01APICX(10)VALUESPACE.
01BREDEFINESAPIC9(10).
变量A,B使用同一个空间,重定义时,重定义变量必须紧跟着被重定义变量后面,并且在字符串同数值一起重定义
时,如果对变量进行初始化,变量会初始化为空格。
5、数组关键词OCCURS
OCCURS整数TIMES.
a.简单数组
01AOCCURS10PICX(30).
b.组合项数组
01A.
05BOCCURS10.
10CPICX(10).
10DPICX(20).
注意:
引用数组中某一元素如下
DISPLAYCOFBOFA
(1)“@@.
6、连结语句STRING
STRINGA,B,CDELIMITEDBYSIZEINTOD.
•将字符串A,B,C按它们定义长度连接赋给变量D.
STRINGA,B,CDELIMITEDBYSPACEINTOD.
•将字符串A,B,C连接赋给变量D,去掉中间所有的空格.
STRING“AAAAAAADELIMITEDBYSIZE
“BBBBBBB”DELIMITEDBYSIZE
BDELIMITEDBYSIZE
INTOD.
•将字符串和字符串变量连接赋给变量D.
7、IF语句
•IF条件
THEN
语句(无“.结束)
ELSE
语句(无“结束)
END-IF.
注:
IF语句最多只能使用三层嵌套,条件用括号括起来。
10关系运算符
运算符
含义
>
大于
<
小于
=
等于
<=
>=
NOT=
不等于
判断字符串能否转换为数字。
注:
NUMERICNOTNUMERIC
ISNOTNUMERIC
11、PERFORM语句
PERFORMXXX-RTN.
•调用子节,直到遇到第一个只包含EXIT语句的段中止,回到该调用语句的下一条语句
EXIT只与它搭配有效。
所以节的定义规定如下:
XXX-RTNSECTION.
语句块
XXX-EXT.
EXIT.
PERFORMXXX-RTNNTIMES.
•循环调用子节N次
PERFORMXXX-RTNUNTILN>30.
•循环调用子节,直到N大于30。
PERFORMUNTIL表达式
语句
END-PERFORM.
•循环调用语句块,表达式判断在语句块前进行。
FROMABYBUNTILX>12
PERFORMVARYINGX
语句
END-PERFORM.
•循环调用语句块,相当于FOR循环
12、EVALUATE
语句
EVALUATE
变量、常量、表达式
WHEN
ANY
TRUE
FALSE
(NOT)常量1THRU(THROUGH)常量2
WHEN
OTHER.
END-EVALUATE
•ANY:
任何变量、常量值
•TRUE、FALSE:
关系表达式的结果
口朮儿基本語法(NOT)常量1THRU(THROUGH)常量2:
值(不)在常量1和常量2构成的闭区间另外,在WHEN后面可以包含简单的关系表达式。
如:
EVALUATEAWHEN=>10
EVALUATEB
WHEN=1OR=2OR=3
语句••…
WHENOTHER
语句••…
END-EVALUATE
WHENOTHER
语句••…
END-EVALUATE.
13、另外,不同的COBOL系统提供了不同内部函数,建议少用内部函数,以下提供几个通用的内部函数
•ORD取得字符的ASICII码如:
便地访问操作ORACLE数据库;PRO*COBOL程序经过ORACLE提供的预编译器预编译生成中间COBOL程序后,程序中所有的SQL语句直接调用ORACLE库函数,再经过COBOL编译器同一般COBOL程序一样编译生成各种可执行模块,由于程序中直接调用ORACLE库函数,所以它们访问操作ORACLE数据库的速度很快,基本语法如下
、特点
所有的SQL或数据库操作相关语句均被括在”EXECSQL”和“END-EXEC”之间,并且它们只能包含一条语句,如:
EXECSQL
SQL语句
END-EXEC.
•所有访问操作数据库的变量都必须是主变量。
•“EXECSQL”,”END-EXEC'及其包含的语句都必须从12列或12列以后开始
三、数据部内容。
•引用两个对象SQLCA,ORACA.
EXECSQLINCLUDESQLCAEND-EXEC.
EXECSQLINCLUDEORACAEND-EXEC.
•主变量定义。
EXECSQLBEGINDECLARESECTIONEND-EXEC.(主变量定义开始)
EXECSQLENDDECLARESECTIONEND-EXEC.(主变量定义结束)
…主变量都必须定义在这里,具体定义和一般的COBO变量一样。
…VARCHA型变量(可变长度).
该变量定义就是在X型变量后加关键字VARYING如:
05STRINGPICX(100)VARYING.
它实际包含两部分(预编译后的中间COBO程序可见)
05STRING.
06STRING-LENPICS9(4)COMP.
06STRING-ARRPICX(100).
STRING-LEN表示字符串的实际长度,STRING-ARR表示字符串的实际内容。
SQL语句中,只能用STRING.
从表中得到值时,STRING-LEN自动被赋值。
向表中写入值时,STRING-LEN需要手工指定长度,SQL将STRING(1:
STRING-LEN部分有效字符串写到表中。
定义主变量时,引用COPY句:
EXECSQLINCLUDEWSITIIOl.cpyEND-EXEC.
•游标的定义可以放在数据中。
四、数据部中SQL语句的基本语法
1)、错误扑获
ORACLE错误扑获是一个全局性的标志,在一个事务(在PRO*COBO中,ORACLE^务以COMMI或ROLLBACKS分割
点)中,后一个错误扑获会覆盖前一个错误扑获设置。
•遇至USQL警告(SQLCODE>0)继续
EXECSQLWHENEVERSQLWARNINGCONTINUEEND-EXEC.
•遇至USQL错误(SQLCODE<0)继续
EXECSQLWHENEVERSQLERRORCONTINUEEND-EXEC.
•遇至USQL错误(SQLCODE<0)跳转
EXECSQLWHENEVERSQLERRORGOTOORA-ERROREND-EXEC.
2)、数据连接
数据库连接在一般的项目开发中用不到,只用于测试程序中(不连接外部数据库)
•方式一(USERNAM和PASSWOF分开,女口:
USERNAME=“OPS$LAPROC51PASSWORD=“LAPROC)
EXECSQL
CONNECT:
USERNAMEIDENTIFIEDBY:
PASSWD
END-EXEC.
•方式二(USERNAM和PASSWORD并,女口:
UID=“OPS$LAPROC51/LAPR”C
EXECSQL
CONNECT:
UID
END-EXEC.
3)、静态SQL语句
•单条记录的检索
EXECSQL
SELECTENAME,SAL,COMM
INTO:
EMP-NAME,:
SALARY,:
COMMISSION:
COMM-IND
FROMEMP
WHEREEMPNO=:
EMP-NUMBER
END-EXEC.
注:
上例中的COMM-IN[为指示变量,在检索操作中每个接受主变量都可指定一个指示变量用来判断主变量是不是接受到一个空值(NULL)(主变量不能接受空值),当指示变量为量应该接受到一个空值(主变量自己表示不出来)
•多条记录的检索(CURSORS标)
••游标的定义
EXECSQL
DECLARECUR_NAMECURSORFOR
SELECTMSG_CD,MSG_1,MSG_2
FROMWWWTMSG1
END-EXEC.
游标的定义:
将SQL查询语句声明为一个游标,不调用ORACL库函数,不会更新
••游标的打开
EXECSQL
OPENCUR_NAME
END-EXEC.
游标的打开:
用游标定义的SQL语句检索数据库,将检索结果生成一个游标对象,记录前一位置,无法确定游标中有没有记录)。
••游标中记录的抽取
EXECSQL
FETCHCUR_NAME
INTO:
HST-MSG-CD,:
HST-MSG-1,:
HST-MSG-2
END-EXEC.
游标中记录的抽取:
将游标中的记录抽取到相应的主变量中,一次抽取一条。
••游标的关闭
EXECSQL
CLOSECUR_NAME
END-EXEC.
游标的关闭:
将现有的游标对象释放,游标再次打开前,必须关闭。
•更新
EXECSQL
UPDATEWWWTMSG1
(9(04)COM型),它
-1时,表示对应的主变
SQLCOD的值。
(此时游标指针在第一条
SETMSG_1=:
WK-MSG-1,
MSG_2=:
WK-MSG-2
WHEREMSG_CD=:
WK-MSG-CDEND-EXEC.
•删除
EXECSQL
DELETEFROMWWWTMSG1
WHEREMSG_CD=:
WK-MSG-CD
END-EXEC
•插入
EXECSQL
INSERT
INTOWWWTMSG1(MSG_CD,
MSG_1,
MSG_2)
VALUES(:
WK-MSG-CD,
:
WK-MSG-1,
:
WK-MSG-2)
END-EXEC
•事务的提交
••方式一(释放连接)
EXECSQLCOMMITWORKRELEASEEND-EXEC.
••方式二(不释放连接)
EXECSQLCOMMITWORKEND-EXEC.
•事务的回滚
••方式一(释放连接)
EXECSQLROLLBACKWORKRELEASEEND-EXEC.••方式二(不释放连接)
EXECSQLROLLBACKWORKEND-EXEC.
•典型的SQLCOD值
••SELECT
1403:
没有检索到记录
…FETCH(游标中记录的抽取)
1403:
游标指针FETCH到游标的尾部
••UPDATE
1403:
没有更新的记录
-60:
死锁
-2049:
由于死锁导致系统超时
••DELETE
1403:
没有删除的记录
-60:
死锁
-2049:
由于死锁导致系统超时
INSERT
•典型ORACL内部变量
SQLCODE:
SQL语句运行后得到的返回值SQLERRMC:
SQL语句运行后得到的返回信息SQLERRD(3):
SQL语句运行处理的记录条数
4)、动态SQL语句
•动态一(直接执行SQL字符串)
••方式一
MOVE"INSERTINTODYN1VALUES('TEST')"TODYNSTMT.EXECSQLEXECUTEIMMEDIATE:
DYNSTMTEND-EXEC.••方式二
EXECSQLEXECUTEIMMEDIATE
"INSERTINTODYN1VALUES('TEST')"
END-EXEC.
动态一:
只用于没有任何参数和返回结果的SQL语句操作
•动态二(用于非检索SQL语句)
••方式一(带参数)
MOVE"INSERTINTOEMP(EMPNO,DEPTNO)VALUES(:
V1,:
V2)"TODYNSTMT-ARR.
EXECSQLPREPARESFROM:
DYNSTMTEND-EXEC.
EXECSQLEXECUTESUSING:
EMPNO,:
DEPTNO1END-EXEC.
其中V1,V2为形参,S为PREPAR生成的临时对象
••方式二(不带参数)
STRING"INSERTINTO"DELIMITEDBYSIZE
"EMP(EMPNO,"DELIMITEDBYSIZE"DEPTNO)"DELIMITEDBYSIZE"VALUES('"DELIMITEDBYSIZE
EMPNODELIMITEDBYSIZE
"','"DELIMITEDBYSIZE
DEPTNO1DELIMITEDBYSIZE"')"DELIMITEDBYSIZE
INTODYNSTMT.
EXECSQLPREPARESFROM:
DYNSTMTEND-EXEC.
EXECSQLEXECUTESEND-EXEC.
动态三(用于检索SQL语句)
…方式一(带参数)
MOVE"SELECTENAMEFROMEMPWHEREDEPTNO=:
V1"
TODYNSTMT.
EXECSQLPREPARESFROM:
DYNSTMTEND-EXEC.
EXECSQLDECLARECCURSORFORSEND-EXEC.
EXECSQLOPENCUSING:
DEPTNOEND-EXEC.
EXECSQLFETCHCINTO:
ENAMEEND-EXEC.
EXECSQLCLOSECEND-EXEC.
••方式二(不带参数)
STRING"SELECTENAMEFROM