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文件中的表现形式。)


本文标签: 变量 定义 编译 编译器