cobol基本语法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基本語法
一、COBOL基本語法
一、cobol的书写格式(每行)
1、前6列为序号区(一般不编辑)
2、第7列为标示列,仅可以写如下几个标示符。

a. “*”注释符(注释当前行的代码)
b “-“字符串连接符
3、第8列---11列为A区,包括以下内容。

a 部、节名。

b 层号01
4、第12列---72列为B区,过程部的程序必须写在B区中。

5、第72以后部分不能编辑。

二、cobol的语法结构(几大部分)
1、标示部(IDENTIFICATION DIVISION):提供程序的一般性文档说明。

2、环境部(ENVIRONMENT DIVISION): 提供程序外部有关的项目。

a.配置节(CONFIGURATION SECTION)
①.指定源计算机(SOURCE-COMPUTE).
②.目标计算机(OBJECT-COMPUTE).
b. 输入输出节(INPUT-OUTPUT SECTION).
文件的物理路径的定义。

方法二:(过程部中动态指定文件)
SELECT FILE-LOG ASSIGN TO SELECT-FILE
ORGANIZATION IS LINE SEQUENTIAL.
在数据部定义字符串变量SELECT-FILE,在文件FILE-LOG打开前动态指定文件路径。

3、数据部(DATA DIVISION)。

程序中的变量都在数据部中定义,Cobol中没有全局变量和局部之分。

(变量的类型结构参照5.变量类型)
a. 文件节(FILE SECTION)
给环境部定义的文件指定一个RECORD变量,读写文件用:
FD FILE-LOG.
01 RECORD-LOG PIC X(2000).
b. 工作存储节
定义程序中用到的临时变量。

a) COBOL变量定义需要加层号(表示层次关系),
·层号从01开始
如: 01 I PIC X(10).
·组合项
如: 01 WORK-AREA.
05 NUM-1 PIC 9(09).
05 STR-1 PIC X(10).
b) 层号依次排列顺序为:01 ,05,10,15,20,30 ·······
c.连接节
子程序的参数的定义。

4、过程部(PROCEDURE DIVISION)
程序的主体:程序的逻辑运算在此操作。

a、每个程序分为四大节(模块),
·前处理(初始化变量,设定初始值等)
·主处理(程序业务处理部分)
·后处理(程序正常结束时的出口)
·错误处理(程序异常结束时的出口)
b、对于子程序,PROCEDURE DIVISION 后应列出LINK节中定义的参数。

如: PROCEDURE DIVISION USING LINK-INPUT-DATA LINK-OUTPUT-DATA.
c、程序结束。

·主程序 STOP RUN.
·子程序 GO BACK.
5、变量类型
COBOL程序的基本变量类型分为两大类字符串型(X)、数值型(9)。

a 字符串型
01 STRING-A PIC X(100).
100个字符长的变量,程序可以局部操作一个变量( STRING-A(start: length)如:
MOVE ALL “X”TO STRING-A(2:10)
(将变量STRING-A第2位开始10长度的内容全赋为”X”字符)
b 数值型
注: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、将一个变量赋给另个变量
move a to b.
b、将一个变量同时赋给另外两个变量。

Move a to b c .
c、将一个变量全部赋为某个字符
move all “x”to a.
d、对于赋值溢出,截取的方式为.
·字符型变量截去左边的溢出部分。

·数值型变量截去整数部高位、小数部低位的溢出部分。

e、组和项传送,它们的数据结构必须相同
f、对于组合项成员的局部引用,应该如下:
01A-AREA.
05 STR-1 PIC X(10).
05 STR-2 PIC X(10).
01B-AREA.
05 STR-1 PIC X(20).
05 STR-2 PIC X(10).
MOVE STR-1 OF A-AREA(1:4) TO STR-1 OF B-AREA(1:4).
3、四则运算
原则上,四则运算不用助记符语句,但对于简单运算( ++,--),可采用助记符语句。

a、加法( ADD 1 TO NUM-1)
b、减法(SUBTRACT 1 FROM NUM-1)
c、其它所有运算均采用COMPUTE 语句
COMPUTE NUM-1 = NUM-2 + NUM3 * 10
运算符如下:
+ 加
- 减
* 乘
/ 除
** 指数
在COMPUTE语句中,变量和运算符间至少留有一个空格。

4、重定义语句REDEFINES(数据部中使用)
01 A PIC X(10) VALUE SPACE.
01 B REDEFINES A PIC 9(10).
变量A,B使用同一个空间,重定义时,重定义变量必须紧跟着被重定义变量后面,并且在字符串同数值一起重定义时,如果对变量进行初始化,变量会初始化为空格。

5、数组关键词OCCURS
OCCURS 整数 TIMES.
a.简单数组
01 A OCCURS 10 PIC X(30).
b. 组合项数组
01 A.
05 B OCCURS 10.
10 C PIC X(10).
10 D PIC X(20).
注意:引用数组中某一元素如下
DISPLAY C OF B OF A(1) “@@”.
6、连结语句STRING
STRING A, B, C DELIMITED BY SIZE INTO D .
·将字符串A, B, C按它们定义长度连接赋给变量D.
STRING A, B, C DELIMITED BY SPACE INTO D .
·将字符串A, B, C连接赋给变量D,去掉中间所有的空格.
STRING “AAAAAAA” DELIMITED BY SIZE
“BBBBBBB ” DELIMITED BY SIZE
B DELIMITED BY SIZE
INTO D .
·将字符串和字符串变量连接赋给变量D.
7、IF语句
·IF 条件
THEN
语句(无“.”结束)
ELSE
语句(无“.”结束)
END-IF.
.
注: IF 语句最多只能使用三层嵌套,条件用括号括起来。

10关系运算符
注:
判断字符串能否转换为数字。

NUMERIC NOT NUMERIC
IS NOT NUMERIC
11、PERFORM 语句
PERFORM XXX-RTN.
·调用子节,直到遇到第一个只包含EXIT语句的段中止,回到该调用语句的下一条语句。

EXIT只与它搭配有效。

所以节的定义规定如下:
XXX-RTN SECTION.
语句块········
XXX-EXT.
EXIT.
PERFORM XXX-RTN N TIMES.
·循环调用子节N次
PERFORM XXX-RTN UNTIL N> 30.
·循环调用子节,直到N 大于30。

PERFORM UNTIL 表达式
语句·······
END-PERFORM.
·循环调用语句块,表达式判断在语句块前进行。

PERFORM VARYING X FROM A BY B UNTIL X > 12 语句·······
END-PERFORM.
·循环调用语句块,相当于FOR 循环。

12、EVALUATE 语句
EVALUATE 变量、常量、表达式
WHEN ANY
TRUE
FALSE
(NOT) 常量1 THRU (THROUGH) 常量2
WHEN OTHER .
END – EVALUATE
·ANY :任何变量、常量值
·TRUE、FALSE :关系表达式的结果
·(NOT) 常量1 THRU (THROUGH) 常量2: 值(不)在常量1和常量2 构成的闭区间
·另外,在WHEN 后面可以包含简单的关系表达式。

如:
EVALUATE A
WHEN => 10
EVALUATE B
WHEN = 1 OR = 2 OR = 3
语句····
WHEN OTHER
语句····
END-EVALUATE
WHEN OTHER
语句····
END-EVALUATE.
13、另外,不同的COBOL系统提供了不同内部函数,建议少用内部函数,以下提供几个通用的内部函数
·ORD 取得字符的ASICII码如:
MOVE FUNCTION ORD (“A”) TO NUMBER.
•UPPER-CASE 字母小写转换成大写如:
MOVE FUNCTION UPPER-CASE (STRING(START:1)) TO STRING(START:1) ·LOWER -CASE 字母小写转换成大写如:
MOVE FUNCTION LOWER-CASE (STRING(START:1)) TO STRING(START:1)
·REVERSE 对字符串中所有字符进行倒序如:
MOVE FUNCTION REVERSE(STRING-1) TO STRING
·LENGTH 取得变量的定义长度,如:
COMPUTE LEN = FUNCTION LENGTH(STRING)
二、PRO*COBOL基本語法
COMPLA使用的PRO*COBOL是ORACLE公司提供的在COBOL程序中嵌入SQL语句的一种方法,使得程序方便地访问操作ORACLE数据库;PRO*COBOL程序经过ORACLE提供的预编译器预编译生成中间COBOL程序后,程序中所有的SQL语句直接调用ORACLE库函数,再经过COBOL编译器同一般COBOL程序一样编译生成各种可执行模块,由于程序中直接调用ORACLE库函数,所以它们访问操作ORACLE数据库的速度很快,基本语法如下。

一、特点。

·所有的SQL或数据库操作相关语句均被括在” EXEC SQL”和“END-EXEC”之间,并且它们只能包含一条语句,如:
EXEC SQL
SQL语句
END-EXEC.
·所有访问操作数据库的变量都必须是主变量。

·“EXEC SQL”,”END-EXEC’及其包含的语句都必须从12列或12列以后开始。

三、数据部内容。

·引用两个对象SQLCA, ORACA.
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE ORACA END-EXEC.
·主变量定义。

EXEC SQL BEGIN DECLARE SECTION END-EXEC. (主变量定义开始)
EXEC SQL END DECLARE SECTION END-EXEC.(主变量定义结束)
··主变量都必须定义在这里,具体定义和一般的COBOL变量一样。

·· VARCHAR型变量(可变长度).
该变量定义就是在X型变量后加关键字VARYING.如:
05 STRING PIC X(100) VARYING.
它实际包含两部分(预编译后的中间COBOL程序可见)
05 STRING.
06 STRING-LEN PIC S9(4) COMP.
06 STRING-ARR PIC X(100).
STRING-LEN 表示字符串的实际长度,STRING-ARR 表示字符串的实际内容。

SQL语句中,只能用STRING.
从表中得到值时,STRING-LEN 自动被赋值。

向表中写入值时,STRING-LEN 需要手工指定长度,SQL将STRING(1:STRING-LEN)部分有效字符串写到表中。

定义主变量时,引用COPY句: EXEC SQL INCLUDE WSIT1101.cpy END-EXEC.
·游标的定义可以放在数据中。

四、数据部中SQL语句的基本语法
1)、错误扑获
ORACLE错误扑获是一个全局性的标志,在一个事务(在PRO*COBOL中,ORACLE事务以COMMIT或ROLLBACK为分割点)中,后一个错误扑获会覆盖前一个错误扑获设置。

·遇到SQL警告(SQLCODE > 0 )继续
EXEC SQL WHENEVER SQLWARNING CONTINUE END-EXEC.
·遇到SQL错误(SQLCODE < 0 )继续
EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
·遇到SQL错误(SQLCODE < 0 )跳转
EXEC SQL WHENEVER SQLERROR GOTO ORA-ERROR END-EXEC.
2)、数据连接
数据库连接在一般的项目开发中用不到,只用于测试程序ドラバ中(不连接外部数据库)
·方式一(USERNAME 和PASSWORD分开,如:USERNAME = “OPS$LAPROC51” PASSWORD = “LAPROC”)EXEC SQL
CONNECT :USERNAME IDENTIFIED BY :PASSWD
END-EXEC.
·方式二(USERNAME 和PASSWORD合并,如:UID = “OPS$LAPROC51/LAPROC”)
EXEC SQL
CONNECT :UID
END-EXEC.
3)、静态SQL语句
·单条记录的检索
EXEC SQL
SELECT ENAME, SAL, COMM
INTO :EMP-NAME, :SALARY, :COMMISSION:COMM-IND
FROM EMP
WHERE EMPNO = :EMP-NUMBER
END-EXEC.
注: 上例中的COMM-IND为指示变量,在检索操作中每个接受主变量都可指定一个指示变量(9(04) COMP型),它
用来判断主变量是不是接受到一个空值(NULL)(主变量不能接受空值),当指示变量为-1时,表示对应的主变
量应该接受到一个空值(主变量自己表示不出来)
·多条记录的检索(CURSOR 游标)
··游标的定义
EXEC SQL
DECLARE CUR_NAME CURSOR FOR
SELECT MSG_CD , MSG_1,MSG_2
FROM WWWTMSG1
END-EXEC.
游标的定义:将SQL查询语句声明为一个游标,不调用ORACLE库函数,不会更新SQLCODE的值。

··游标的打开
EXEC SQL
OPEN CUR_NAME
END-EXEC.
游标的打开:用游标定义的SQL语句检索数据库,将检索结果生成一个游标对象,(此时游标指针在第一条
记录前一位置,无法确定游标中有没有记录)。

··游标中记录的抽取
EXEC SQL
FETCH CUR_NAME
INTO : HST-MSG-CD , : HST-MSG-1,:HST-MSG-2
END-EXEC.
游标中记录的抽取:将游标中的记录抽取到相应的主变量中,一次抽取一条。

··游标的关闭
EXEC SQL
CLOSE CUR_NAME
END-EXEC.
游标的关闭: 将现有的游标对象释放,游标再次打开前,必须关闭。

·更新
EXEC SQL
UPDATE WWWTMSG1
SET MSG_1 = : WK-MSG-1,
MSG_2 = : WK-MSG-2
WHERE MSG_CD = : WK-MSG-CD
END-EXEC.
·删除
EXEC SQL
DELETE FROM WWWTMSG1
WHERE MSG_CD = : WK-MSG-CD
END-EXEC
·插入
EXEC SQL
INSERT
INTO WWWTMSG1(MSG_CD,
MSG_1,
MSG_2)
VALUES (:WK-MSG-CD,
:WK-MSG-1,
:WK-MSG-2)
END-EXEC
·事务的提交
··方式一(释放连接)
EXEC SQL COMMIT WORK RELEASE END-EXEC.
··方式二(不释放连接)
EXEC SQL COMMIT WORK END-EXEC.
·事务的回滚
··方式一(释放连接)
EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
··方式二(不释放连接)
EXEC SQL ROLLBACK WORK END-EXEC.
·典型的SQLCODE值
·· SELECT
1403 : 没有检索到记录
·· FETCH(游标中记录的抽取)
1403 : 游标指针FETCH到游标的尾部
·· UPDATE
1403 : 没有更新的记录
-60 : 死锁
-2049: 由于死锁导致系统超时
·· DELETE
1403 : 没有删除的记录
-60 : 死锁
-2049: 由于死锁导致系统超时
·· INSERT
-1 : 插入的记录已存在
-60 : 死锁
-2049: 由于死锁导致系统超时
·典型ORACLE内部变量
SQLCODE : SQL语句运行后得到的返回值
SQLERRMC: SQL语句运行后得到的返回信息
SQLERRD(3): SQL语句运行处理的记录条数
4)、动态SQL语句
·动态一(直接执行SQL字符串)
··方式一
MOVE "INSERT INTO DYN1 VALUES ('TEST')" TO DYNSTMT.
EXEC SQL EXECUTE IMMEDIATE :DYNSTMT END-EXEC.
··方式二
EXEC SQL EXECUTE IMMEDIATE
"INSERT INTO DYN1 VALUES ('TEST')"
END-EXEC.
动态一:只用于没有任何参数和返回结果的SQL语句操作·动态二(用于非检索SQL语句)
··方式一(带参数)
MOVE "INSERT INTO EMP (EMPNO, DEPTNO) VALUES (:V1, :V2)" TO DYNSTMT-ARR.
EXEC SQL PREPARE S FROM :DYNSTMT END-EXEC.
EXEC SQL EXECUTE S USING :EMPNO, :DEPTNO1 END-EXEC.
其中V1,V2为形参,S为PREPARE生成的临时对象
··方式二(不带参数)
STRING "INSERT INTO " DELIMITED BY SIZE
"EMP (EMPNO, " DELIMITED BY SIZE
"DEPTNO) " DELIMITED BY SIZE
"VALUES ( '" DELIMITED BY SIZE
EMPNO DELIMITED BY SIZE
"' , '" DELIMITED BY SIZE
DEPTNO1 DELIMITED BY SIZE
"' ) " DELIMITED BY SIZE
INTO DYNSTMT.
EXEC SQL PREPARE S FROM :DYNSTMT END-EXEC.
EXEC SQL EXECUTE S END-EXEC.
·动态三(用于检索SQL语句)
··方式一(带参数)
MOVE "SELECT ENAME FROM EMP WHERE DEPTNO = :V1"
TO DYNSTMT.
EXEC SQL PREPARE S FROM :DYNSTMT END-EXEC.
EXEC SQL DECLARE C CURSOR FOR S END-EXEC.
EXEC SQL OPEN C USING :DEPTNO END-EXEC.
EXEC SQL FETCH C INTO :ENAME END-EXEC.
EXEC SQL CLOSE C END-EXEC.
··方式二(不带参数)
STRING "SELECT ENAME FROM " DELIMITED BY SIZE "EMP WHERE DEPTNO = '" DELIMITED BY SIZE DEPTNO DELIMITED BY SIZE "' " DELIMITED BY SIZE INTO DYNSTMT.
EXEC SQL DECLARE C CURSOR FOR S END-EXEC.
EXEC SQL OPEN C END-EXEC.
EXEC SQL FETCH C INTO :ENAME END-EXEC.
EXEC SQL CLOSE C END-EXEC.
所有的检索SQL语句都必须采用游标方式。

相关文档
最新文档