admin 管理员组文章数量: 887020
2024年1月14日发(作者:sql的orderby怎么用)
Pro*Cobol基本篇
概述:
Pro*系列语言是Oracle提供的利用嵌入式SQL实现对Oracle进行访问的语言工具、根据宿主语言的不同,主要有Pro*C、Pro*Cobol、Pro*Pascal、Pro*Fortran等。其中较为常用的是Pro*C和Pro*Cobol。在这里,以Pro*Cobol为基础,兼对Pro*系列语言的共性作一些介绍。
采用Pro*系列语言编写的程序,从语法上来看分为宿主语言与嵌入式SQL两部分。其中宿主语言部分的语法不受任何影响,而嵌入式SQL则采用PL/SQL的语法。两部分通过定义在交换区的变量(Host变量)进行数据交换。
详细说明:
Pro*Cobol中Host变量的定义方法:
Pro*Cobol中Host变量和普通变量一样定义在“WORKING-STORAGE SECTION”中,可以直接定义,也可以和普通变量一样通过COPY句进行定义。
直接定义例:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 ORA-WORKING-ITEMS.
05 ORADMY-IND PIC S9(04) COMP.
05 CONNECT-ID PIC X(01) VALUE '/'.
05 STREAM PIC X(1500).
EXEC SQL END DECLARE SECTION END-EXEC.
解说,所有直接定义的Host变量必须定义在
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
EXEC SQL END DECLARE SECTION END-EXEC.
两句之间。其他和普通变量的定义没有什么区别。
通过COPY句定义例:
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE END-EXEC.
解说,所有通过COPY句定义的Host变量不一定定义在
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
EXEC SQL END DECLARE SECTION END-EXEC.
两句之间。另外使用的语句为INCLUDE而不是COPY。
Varchar类型在COBOL中的处理方法:
Oracle中有一种Varchar(变长字符串)的数据类型,而COBOL的变量都是定长的,对此,Pro*Cobol增加了一种特殊的数据类型VARYING。定义例如下:
05 HST-I-DYNSTMT PIC X(2000) VARYING.
VARYING变量必须作为Host变量定义。它的特殊之处在于,它的定义形式是简单变量,在SQL处理中,也被作为简单变量使用,但在Cobol处理中它实际上是一个集团变量。例如上面这个变量的展开形式为
05 HST-I-DYNSTMT.
06 HST-I-DYNSTMT-LEN PIC S9(4) COMP.
06 HST-I-DYNSTMT-ARR PIC X(2000).
其中HST-I-DYNSTMT-ARR 中存放的是字符串的内容,HST-I-DYNSTMT-LEN 存放的是字符串实际使用的长度。HST-I-DYNSTMT-LEN的大小是由字符串的长度决定的。
在使用时HST-I-DYNSTMT-ARR和HST-I-DYNSTMT-LEN必须分别赋值的。由于HST-I-DYNSTMT-LEN的存在,HST-I-DYNSTMT的实际大小不是2000,而是2002如果不注意在编程中很容易出错。
Pro*Cobol处理部中SQL语句的方法:
在处理部中有两种不同的执行方法,第一种是直接执行SQL语句,例:
EXEC SQL
SELECT JISHA_MM_TEIGI
INTO :H2-JISHA-MM-TEIGI
FROM WUATCB03
WHERE USER_CD = :H2-USER-CD
END-EXEC.
其中所使用的变量必须是Host变量。
第二种是执行包含有SQL内容的字符串变量,例1(定义游标):
MOVE "SELECT YLLW_HSK_ADD2_KNJ FROM WZATKY01"
TO STREAM。
EXEC SQL
PREPARE DYNAMIC_SQL FROM :STREAM
END-EXEC
EXEC SQL
DECLARE C1 CURSOR FOR DYNAMIC_SQL
END-EXEC
其中所使用的变量STREAM必须是Host变量。
例2(更新):
MOVE "DELETE WZATKY01 WHERE USER_CD = '2904'"
TO HST-I-DYNSTMT。
EXEC SQL
PREPARE I_SQLSTMT FROM :HST-I-DYNSTMT
END-EXEC.
EXEC SQL
EXECUTE I_SQLSTMT
END-EXEC.
其中所使用的变量HST-I-DYNSTMT必须是Host变量。
上面两个例子中使用的“PREPARE”“DECLARE”“EXECUTE”是PL/SQL的保留字,而“DYNAMIC_SQL”“I_SQLSTMT”是PL/SQL的变量。
关于SQLCA和ORACA:
在Pro*Cobol程序中可以见到下面这样的定义、
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE ORACA END-EXEC.
SQLCA和ORACA是系统提供的COPY句,它们中存放了每一次SQL执行的返回值,其中SQLCA中是主要信息,ORACA中是扩展信息,在Pro*Cobol程序中为了对SQL执行结果进行判断,必须导入SQLCA,而ORACA则不一定需要。
SQLCA中最常用的返回值有两个,分别是SQLCODE(执行结果代码)和SQLERRMC(执行结果信息)。
预编译的概念:
Pro*Cobol是嫁接在Cobol上的编程语言,它没有自己的编译器,需要通过Cobol的编译器最终生成可执行文件。但是,Cobol的编译器无法识别SQL部分的语法。Oracle提供的解决方法是,利用一个解释程序,把Pro*Cobol源文件中的SQL部分解释成Cobol的编译器可以识别的代码,生成一个纯Cobol文件,并把这个文件提供给Cobol的编译器进行编译,最终生成可执行文件。从Pro*Cobol源文件生成纯Cobol文件的过程就叫预编译,生成纯Cobol文件的解释程序就叫预编译器。
预编译器会对涉及SQL部分的语法错进行检查,预编译通过后而再利用编译器检查Cobol自己的语法错。所以在编译Pro*Cobol程序时有时会出现编译、修改几次后,编译错突然增加这样的现象。这可能是因为先出的一直是预编译错,预编译错解决之后出的是真正的Cobol编译错。
(在本目录下提供了和两个文件,其中是预编译生成的纯Cobol文件。请大家留意pco文件通过预编译后SQL部分在cob文件中的表现形式。)
版权声明:本文标题:07_ProCobol第1课 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705232106h477917.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论