ORACLE培训教材之第三讲
- 格式:doc
- 大小:121.00 KB
- 文档页数:16
Pro * C 的使用一Pro*C 程序概述:1.什么是Pro*C程序在ORACLE数据库管理和系统中,有三种访问数据库的方法;(1)用SQL*Plus,它有SQL命令以交互的应用程序访问数据库;(2)用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;(3)利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。
Pro*C就属于第三种开发工具之一,它把过程化语言C和非过程化语言SQL最完善地结合起来,具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。
在Pro*C程序中可以嵌入SQL语言,利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行,还可以实现事务的提交和回滚。
在Pro*C程序中还可以嵌入PL/SQL块,以改进应用程序的性能,特别是在网络环境下,可以减少网络传输和处理的总开销。
2.Pro*C的程序结构图通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序,因此它的组成很类似C程序。
但因为它内嵌有SQL语句或PL/SQL块,所以它还含有与之不同的成份。
为了让大家对Pro*C有个感性的认识,特将二者差别比较如下:C的全程变量说明C源程序函数1:同函数K。
函数2:同函数K。
C的局部变量说明函数K可执行语句应用程序首部C的外部变量说明外部说明段(ORACLE变量说明)通讯区说明Pro*C源程序函数1:同函数K。
函数2:同函数K。
局部变量说明程序体内部说明部分内部说明段通讯区说明函数KC 的可执行语句 可执行语句 SQL 的可执行语句或PL/SQL块二.Pro*C 程序的组成结构每一个Pro*C 程序都包括两部分:(1)应用程序首部;(2)应用程序体应用程序首部定义了ORACLE 数据库的有关变量, 为在C 语言中操纵ORACLE 数据库做好了准备。
应用程序体基本上由Pro*C 的SQL 语句调用组成。
主要指查询SELECT 、INSERT 、UPDATE 、DELETE 等语句。
1. 应用程序首部应用程序的首部就是Pro*C 的开始部分。
它包括以下三部分:● C 变量描述部分;● SQL 变量描述部分(DECLARE 部分);● SQL 通信区。
(1) .DECLARE 部分(描述部分)描述部分说明程序的SQL 变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。
它可以出现在程序的主部,也可出现在局部● SQL 变量的说明和使用据类型的扩充。
这在以后会谈到。
SQL变量的使用应注意以下几点:●必须在描述部分明确定义●必须使用与其定义相同的大小写格式●在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C 语句中引用时不需加冒号。
●不能是SQL命令中的保留字。
●可以带指示变量。
例如:EXEC SQL BEGIN DECLARE SECTIONS;V ARCHAR programe[30];Int porgsal, pempno;EXEC SQL END DECLARE SECTION;EXEC SQL SELECT ENAME , SALINTO: programe, : progsalFROM EMPWHERE EMPNO = : pempno;(2). 指示器变量的说明和引用指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充当输入或输出的变量)。
每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL)指示器变量的说明基本同一般SQL变量一样,但必须定义成2字节的整型,如SHORT、INT。
在SQL语句中引用时,其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。
当指示器变量为-1时,表示空值。
例如:EXEC SQL BEGIN DECLARE SECTION ;INT dept- number;SHORT ind – num;CHAR emp –name;EXEC SQL END DECLARE SECTION ;Scanf(“90d %s”, & dept- number , dept – name );If (dept – number ==0)Ind – num = -1;ElseInd – num = 0;EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)V ALUES(:dept – number : ind- num , :dept – name);其中ind – num是dept – number 的指示器变量。
当输入的dept – number 值是0时,则向DEPT 表的DEPTNO列插入空值。
(3).指针SQL变量的说明和使用指针SQL变量在引用前也必须在DECLARE 部分先说明。
其说明格式同C语言。
在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。
在C语句中用法如同C语言的指针变量。
(4).数组SQL变更的说明和引用在SQL语句中引用数组时,只需写数组名(名字前加冒号),不需写下标,在C语句中用法如同C语言的数组变量。
使用数组可大大降低网络传输开销。
如要向一表插入100行数据,如果没有数组,就要重复100次,而引用后,只须执行一次insert语句、便可一次性插入。
例如:EXEC SQL BEGIN DECLARE SECTION;Int emp_number[100];Char emp_name[100][15];Float salary[100],commission[100];Int dept_number;EXEC SQL END DECLARE SECTION;….EXEC SQL SELECT EMPNO,ENAME,SAL,COMMINTO :emp_number,:emp_name,:salary,:commissionFROM EMPWHERE DEPTNO=:dept_number;在使用数组时,应注意以下几点;●不支持指针数组●只支持一维数组,而emp-name [100][15]视为一维字符串●数组最大维数为32767●在一条SQL语句中引用多个数组时,这些数组维数应相同●在V ALUES , SET, INTO 或WHERE子名中,不允许把简单SQL变量与数组SQL变量混用●不能在DELARE部分初始化数组例如:下面的引用是非法的EXEC SQL BEGIN DECLARE SECTION;Int dept – num [3] = {10,20,30};EXEC SQL END DECLARE SECTION ;EXEC SQL SELECT EMPNO, ENAME , SALINTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ]FROM EMP(5) 伪类型V ARCHAR的说明和引用V ARCHAR变量在引用之前也必须在说明段说明,说明时必须指出串的最大长度,如:EXEC SQL BEGIN DECLARE SECTION;Int book – number;V ARCHAR book – name [ 50 ];EXEC SQL END DECLARE SECTION ;在预编绎时,book – name 被翻译成C语言中的一个结构变量;Struct { unsigned short len ;Unsigned chart arr [ 20 ] ;} boo – name由此看出,V ARCHAR变量实际上是含长度成员和数组成员的结构变量。
在SQL语句中引用时,应引用以冒号为前缀的结构名,而不加下标,在C语句中引用结构成员。
V ARCHAR变量在作输出变量时,由ORACLE自动设置,在作为输入变量时,程序应先把字符串存入数组成员中,其长度存入长度成员中,然后再在SQL语句中引用。
例如:Main( ){ .......scanf(“90s, 90d‟, book – name .arr, & book – number );book – name .len = strlen (book – name .arr);EXEC SQL UPDATE BOOKSET BNAME = : book – name ;BDESC = : book – number ;}(6)SQL通信区SQL 通信区是用下列语句描述的:EXEC SQL INCLUDE SQLCA;此部分提供了用户运行程序的成败记录和错误处理。
SQLCA的组成SQLCA是一个结构类型的变量,它是ORACLE 和应用程序的一个接口。
在执行Pro*C程序时,ORACLE 把每一个嵌入SQL语句执行的状态信息存入SQLCA中,根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示:Struct sqlca{ char sqlcaid [ 8 ] ; ----→标识通讯区long sqlabc; ---→通讯区的长度long sqlcode; ---→保留最近执行的SQL语句的状态码struct { unsigned short sqlerrml; -----→信息文本长度}sqlerrm;char sqlerrp [ 8 ];long sqlerrd [ 6 ];char sqlwarn [ 8 ];char sqlext [ 8 ];}struct sqlca sqlca;其中,sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。
程序员根据这些状态码做出相应的处理。
这些状态码值如下:0: 表示该SQL语句被正确执行,没有发生错误和例外。
>0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。
<0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。
当出现此类错误时,当前事务一般应回滚。
2.应用程序体在Pro*C程序中,能把SQL语句和C语句自由地混合书写,并能在SQL 语句中使用SQL变量,嵌入式SQL语句的书写文法是:●以关键字EXEC SQL开始●以C语言的语句终结符(分号)终结SQL语句的作用主要用于同数据库打交道。
C语言程序用于控制,输入,输出和数据处理等。
(1)连接到ORACLE数据库在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。