第08章 Pro C 的使用_第1页
第08章 Pro C 的使用_第2页
第08章 Pro C 的使用_第3页
第08章 Pro C 的使用_第4页
第08章 Pro C 的使用_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、前言前言在Visual C+下开发Oracle库接口主要有两种方法。一种方法是利用Visual C+提供的多种数据库访问技术,如开放数据库连接ODBC、数据存取对象DAO、对象连接和嵌入数据库OLE DB和ActiveX数据对象ADO等。另一种方法是在Visual C+中嵌入SQL语句,这就是所指的Pro*C/C+。前一种方法由于有MFC强大的类库支持,熟悉VC编程时则实现方便,且可移植性强;但是,与PROC 相比,应用程序需要经过两层才能和数据库通信接口建立联系,编程相对复杂,执行效率相对较低。PROC支持嵌入式PL/SQL 块等直接调用Oracle 库,将过程化语言和非过程化语言相结合,形

2、成一种更强的开发工具,可开发出满足各种复杂要求的优化应用程序,执行效率高。适合熟悉Oracle技术的人员应用。但是用PROC 开发出的应用程序无法向异构数据库平台移植。一一 Pro Pro* *C C 程序概述程序概述1什么是Pro*C程序2Pro*C的程序结构图1 1什么是什么是ProPro* *C C程序程序在ORACLE数据库管理和系统中, 有三种访问数据库的方法;用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;利用在第三代语言内嵌入的SQL

3、语言或ORACLE库函数调用来访问。Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。在Pro*C程序中还可以嵌入PL/SQL块, 以改进应用程序的性能, 特别是在网络环境下,可以减少网络传输和处理的总开销。2 2ProPro* *C C的程序结构图的程序结构图通俗来说,Pro*C程序

4、实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性的认识, 特将二者差别比较如下:C源程序C的全程变量说明函数1:同函数K函数2:同函数KC的局部变量说明函数K可执行语句Pro*C源程序 应用程序首部 C的外部变量说明外部说明段(ORACLE变量说明)通讯区说明函数1:同函数K。函数2:同函数K。C局部变量说明程序体内部说明部分内部说明段通讯区说明函数KC的可执行语句可执行语句 SQL的可执行语句或PL/SQL块二二ProPro* *C C程序的组成结构程序的组成结

5、构 每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。应用程序的组成结构如下图:SQL通信区SQL通信区SQL通信区SQL通信区EXEC SQL BEGIN DECLARE SECTION(SQL变量的定义)EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLLA;EXEC SQL CONNECT: IDENTIF

6、IED BY: SQL 语句及游标的使用应用程序体描述部分应用程序首部SQL通信区1 1 应用程序首部应用程序首部应用程序的首部就是Pro*C的开始部分。它包括以下三部分:1.C变量描述部分;2.SQL变量描述部分(DECLARE部分);3.SQL通信区。 (1) .DECLARE(1) .DECLARE部分(描述部分)部分(描述部分)描述部分说明程序的SQL变量,定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。它可以出现在程序的主部,也可出现在局部SQL变量的说明和使用在说明段能为SQL变

7、量指定的数据类型如表所示:这些数据类型实际上就是C语言的数据类型, 其中VARCHAR中视为C数据类型的扩充。这在以后会谈到。数据类型数据类型描述描述CHARCHAR(n)INT SHORT LONG FLOAT DOUBLE VARCHAR单字符n个字符数组整数短整数长整数单精度浮点数双精度浮点数变长字符串SQL变量的使用应注意以下几点:必须在描述部分明确定义必须使用与其定义相同的大小写格式在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C语句中引用时不需加冒号。不能是SQL命令中的保留字。可以带指示变量。例如:EXEC SQL BEGIN DECLARE SECTIONS;EX

8、EC SQL BEGIN DECLARE SECTIONS; VARCHAR programe30; VARCHAR programe30; Int porgsal, pempno; Int porgsal, pempno;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT ENAME , SAL EXEC SQL SELECT ENAME , SAL INTO: programe, : progsal INTO: programe, : progsal FROM EMP FROM EMP WHE

9、RE EMPNO = : pempno; WHERE EMPNO = : pempno;(2). (2). 指示器变量的说明和引用指示器变量的说明和引用指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充 当输入或输出的变量)。每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL)指示器变量的说明基本同一般SQL变量一样, 但必须定义成2字节的整型,如SHORT、INT。在SQL语句中引用时, 其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。当指示器变量为-1时,表示空值。例如:EXEC SQL BEGIN D

10、ECLARE SECTION ; EXEC SQL BEGIN DECLARE SECTION ; INT dept- number; INT dept- number; SHORT ind num; SHORT ind num; CHAR emp name; CHAR emp name;EXEC SQL END DECLARE SECTION ; EXEC SQL END DECLARE SECTION ; Scanf(“90d %s”, & dept- number , dept name );Scanf(“90d %s”, & dept- number , dept na

11、me ); If (dept number =0) If (dept number =0) Ind num = -1; Ind num = -1; Else Else Ind num = 0; Ind num = 0;EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)VALUES(:dept number : ind- num , :dept name);VALUES(:dept number : ind- num , :dept name);( (3 3) ). .指针指针SQL

12、SQL变量的说明和使用变量的说明和使用指针SQL变量在引用前也必须在DECLARE 部分先说明。其说明格式同C语言。在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。在C语句中用法如同C语言的指针变量。( (4 4) ). .数组数组SQLSQL变更的说明和引用变更的说明和引用在SQL语句中引用数组时,只需写数组名(名字前加冒号), 不需写下标,在C语句中用法如同C语言的数组变量。使用数组可大大降低网络传输开销。如要向一表插入100行数据,如果没有数组,就要重复100次, 而引用后,只须执行一次insert语句、便可一次性插入。例如:EXEC SQL BEGIN DE

13、CLARE SECTION;EXEC SQL BEGIN DECLARE SECTION; Int emp_number100; Int emp_number100; Char emp_name10015; Char emp_name10015; Float salary100,commission100; Float salary100,commission100; Int dept_number; Int dept_number;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT EMPNO,

14、ENAME,SAL,COMMEXEC SQL SELECT EMPNO,ENAME,SAL,COMM INTO :emp_number,:emp_name,:salary,:commission INTO :emp_number,:emp_name,:salary,:commission FROM EMP FROM EMP WHERE DEPTNO=:dept_number; WHERE DEPTNO=:dept_number; 在使用数组时,应注意以下几点;不支持指针数组只支持一维数组, 而 emp-name 10015视为一维字符串数组最大维数为32767在一条SQL语句中引用多个数组时,

15、这些数组维数应相同在VALUES , 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 , SAL INTO : emp num i , : emp name i , : salarg i FROM EMP (5) (5) 伪类型伪类型VARCHARVARCHAR的说明

16、和引用的说明和引用VARCHAR变量在引用之前也必须在说明段说明, 说明时必须指出串的最大长度,如: EXEC SQL BEGIN DECLARE SECTION; Int book number; VARCHAR book name 50 ; EXEC SQL END DECLARE SECTION ; 在预编绎时, book name 被翻译成C语言中的一个结构变量; Struct unsigned short len ; Unsigned chart arr 20 ; boo name 由此看出, VARCHAR变量实际上是含长度成员和数组成员的结构变量。在SQL语句中引用时,应引用以冒

17、号为前缀的结构名, 而不加下标,在C语句 中引用结构成员。VARCHAR变量在作输出变量时,由ORACLE自动设置, 在作为输入变量时,程序应先把字符串存入数组成员中, 其长度存入长度成员中,然后再在SQL语句中引用。例如:main( ) . scanf(“90s, 90d, book name .arr, & book number ); book name .len = strlen (book name .arr); EXEC SQL UPDATE BOOK SET BNAME = : book name ; BDESC = : book number ; (6 6)SQLSQL

18、通信区通信区 SQL 通信区是用下列语句描述的: EXEC SQL INCLUDE SQLCA; 此部分提供了用户运行程序的成败记录和错误处理。 SQLCA SQLCA的组成的组成SQLCA是一个结构类型的变量,它是ORACLE 和应用程序的一个接口。在执行 Pro*C程序时, ORACLE 把每一个嵌入SQL语句执行的状态信息存入SQLCA中, 根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示: Struct sqlca char sqlcaid 8 ; -标识通讯区 long sqlabc; - 通讯区的长度 long sqlcode; -保留最近执行的

19、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:表示由于数据库、系统、网络或应用程序的错误,OR

20、ACLE未执行该SQL语句。 当出现此类错误时,当前事务一般应回滚。 2 2应用程序体应用程序体在Pro*C程序中, 能把SQL语句和C语句自由地混合书写,并能在SQL语句中使用SQL变量,嵌入式SQL语句的书写文法是:以关键字EXEC SQL开始以C语言的语句终结符(分号)终结SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,输出和数据处理等。(1).(1).连接到连接到ORACLEORACLE数据库数据库在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。即登录到ORACLE上。所连接命令应该是应用程序的第一个可执行命令。连接命令格式如下: EXEC SQL CO

21、NNECT: IDENTIFIED BY : 或EXEC SQL CONNECT: / 在使用上述两种格式进行登入时, 应当首先在说明段定义包含用户名和口令的SQL 变量,并在执行CONNECT之前设置它们,否则会造成登录失败。例如:EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION ; VARCHAR usename 20; VARCHAR usename 20; VARCHAR password20; VARCHAR password20;EXEC SQL END DECLARE EXEC SQL END DECLAR

22、E . . strcpy ( usename.arr, “CSOTT); strcpy ( usename.arr, “CSOTT); usename.len = strlen (username.arr); usename.len = strlen (username.arr); strcpy (password.arr , “TIGER); strcpy (password.arr , “TIGER); password .len = strlen( password .arr); password .len = strlen( password .arr); EXEC SQL WHENE

23、VER SQLERROR GOTO SQLERR; EXEC SQL WHENEVER SQLERROR GOTO SQLERR; EXEC SQL CONNECT :username INDNTIFIED BY : password; EXEC SQL CONNECT :username INDNTIFIED BY : password;注意注意: : 不能把用户名和口令直接编写到不能把用户名和口令直接编写到CONNECTCONNECT语句中,或者把用引号语句中,或者把用引号()括起来的字母串在)括起来的字母串在CONNECT CONNECT 语句中,语句中, 如下面的语句是无效的。如下面的

24、语句是无效的。 EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT IDENTIFIED BY TIGER; EXEC SQL CONNECT SCOTT IDENTIFIED BY TIGER;(2). (2). 插入、更新和删除插入、更新和删除 在讲述SQL语言时已详细讲过, 这里就不举例说明了。(3). (3). 数据库查询及游标的使用数据库查询及游标的使用在PRO*C中, 查询可分为两种类型:返回行的查询.此种单行或定

25、行数的查询;返回多查询要求使用游标来控制每一行或每一组(主变量用数组).返回单行或定行数的查询在PRO*C中的查询SQL SELECT语句由以下几个子句组成: SELECT INTO FROM WHERE CONNECT BY UNION INTERSECT MINUS GROUP BY HAVING ORDER BY 其中WHERE子句中的查询条件可以是一个属性或多个属性的集合,在执行是赋值的主变量也可放在WHERE子句中.WHERE子句中所用的主变量称为输入主变量。如: SELECT EMPNO, JOB, SAL INTO:PNAME, :PJOB, :PSAL FROM EMP WHE

26、RE EMPNO=:PEMPNO;若没有找到限定的行, 则SQLCA.SQLCODE返回”+1403”, 表明”没有找到”。INTO从句中的主变量叫输出主变量,它提供了查询时所需要的信息。在任何项送给主变量之前,都要求ORACLE把这些项转换成主变量的数据类型。对于数字是通过截断来完成的(如:9.23转换为9)。如果已确定查询只返回一行,那么就不必使用游标,只给SELECT语句增加一个INTO子句即可。在语义上INTO语句在FROM之前的查询中有多少个选择项就有多少个输出主变量。若在SELECT项中表达式的数目不等于INTO子句中主变量的数目,就把SQLCA.SQLWARN3置为”W”。多行查

27、询及游标的使用如果查询返回多行或不知道返回多少行,使用带有ORACLE游标(CURSOR)的SELECT语句。游标是ORACLE和PRO*C存放查询结果的工作区域。一个游标(已命名的)与一条SELECT语句相关联。操作游标有由4条命令:(1)DECLARE CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。A. A. 定义游标定义游标一个游标必须首先定义, 才能使用它。语法为:EXEC SQL DECLARE 游标名CORSOR FOR SELECT 列 FROM 表例如:EXEC SQL DECLARE CSOR, CURSOR FOR SELEC

28、T ENAME , JOB, SAL FROM EMPWHERE DEPTNO=:DEPTNO;当赋给一个与查询相关联的游标CURSOR之后, 当SELECT查询EMP时可从数据库中返回多行,这些行就是CURSOR的一个活动区域。注意:1.定义游标必须在对游标操作之前完成;2.PRO*C不能引用没有定义的游标;3.游标定义后,其作用范围是整个程序。所以对一个程序来讲, 同时定义两个相同的游标是错误的。B. B. 打开游标打开游标打开游标的OPEN语句主要用来输入主变量的内容,这些主要是WHERE中使用的主变量。打开游标的语句是:EXEC SQL OPEN 游标名游标名当打开游标后,可以从相关的

29、查询中取出多于一行的结果。所有满足查询标准的行组成一集合,叫做“游标活动集”。通过取操作,活动集中的每一行或每一组是一个一个返回的,查询完成后, 游标就可关闭了。如图所示:注意:1)游标处于活动集的第一行前面;2)若改变了输入主变量就必须重新打开游标。定义游标DECLARE开始查询SELECT打开游标OPEN从活动集取数据FETCH查询完成关闭游标CLOSEC. C. 取数据取数据从活动集中取出一行或一组把结果送到输出主变量中的过程叫取数据。输出主变量的定义在取数据语句中。取数据的语句如下:EXEC SQL FETCH游标名INTO:主变量1,主变量2,FETCH的工作过程如图所示:查询结果查

30、询结果查询结果查询结果FETCH在游标打开后输出至当前游标使用FETCH应注意以下几点:游标必须先定义再打开。只有在游标打开之后才能取数据,即执行FETCH语句。FETCH语句每执行一次,从当前行或当前组取数据一次,下一行或下一组向上移一次。游标每次所指的行或组都为当前行或当前组,而FETCH每次都是取游标所指定的行或组的数据。当游标活动集空之后,ORCLE返回一个SQLCA。SQLCA(=1403)。若希望此游标再操作, 必须先关闭再打开它。在C程序中可以开辟一个内存空间,来存放操作结果,这样就能利用开辟的空间来灵活操纵查询的结果。D D关闭游标关闭游标取完活动集中所有行后,必须关闭游标,以

31、释放与该游标有关的资源。关闭游标的格式为:EXEC SQL CLOSE 游标名;例如:EXEC SQL CLOSE C1;(4)(4)举例举例EXEC SQL DECLARE SALESPEOPLE CURSOR FOR SELECT SSNO, NAME, SALARYFROM EMPLOYEEWHERE DNAME=Sales;EXEC SQL OPEN SALESPEOPLE;EXEC SQL FETCH SALESPEOPLEINTO :SS,:NAME,:SAL;EXEC SQL CLOSE SALESPEOPLE; ( (5 5) ) SQLSQL嵌套的方法及应用嵌套的方法及应用嵌

32、入SQL与交互式SQL在形式上有如下差别:在SQL语句前增加前缀“EXEC SQL”, 这一小小的差别其目的是在于预编译时容易识别出来, 以便把每一条SQL作为一条高级语言来处理。每一SQL语句分为说明性语句和可执行语句两大类。可执行语句又分为数据定义、数据控制、数据操纵、数据检索四大类。可执行性SQL语句写在高级语言的可执行处;说明性SQL语句写在高级语言的说明性的地方。 例如:在PRO*C程序中建立一个名为BOOK的表结构,过程如下:#includestdio.hEXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20, pwd20;EXEC SQL END

33、 DECLARE SECTION;EXEC SQL INCLUDE SQLCA;void main() /*login database*/ strcpy(uid.arr,wu); uid.len=strlen(uid,arr); strcpy(pwd.arr,wu); pwd.len=strlen(pwd.arr); EXEC SQL CONNECT:uid IDENTIFEED BY:pwd; EXEC SQL CREATE TABLE book ( acqnum number, copies number , price number); EXEC SQL COMMIT WORK REL

34、EASE; EXIT;PRO*C可非常简便灵活地访问ORCLE数据库中的数据,同时又具有C语言高速的特点,因而可完成一些ORACLE产品不能完成的任务,例如以下一个固定的特殊格式输出结果。SQL嵌套源程序示例#include #include #include typedef char asciz20;EXEC SQL BEGIN DECLARE SECTION;EXEC SQL TYPE asciz IS STRING (20) REFERENCE;asciz username;asciz password;asciz emp_name5;int emp_number5;float sala

35、ry5;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE sqlca;void print_rows();void sqlerror();main() int num_ret; strcpy(username,SCOTT); strcpy(password, TIGER); EXEC SQL WHENEVER SQLERROR DO sqlerror(); EXEC SQL CONNECT:username IDENTIFIED BY:password; printf (nConnected to ORACLE as user:%sn, usernam

36、e); EXEC SQL DECLARE c1 CURSOR FOR SELECT EMPNO, ENAME, SAL FROM EMP; EXEC SQL OPEN c1; num_ret = 0; for(;) EXEC SQL WHENEVER NOT FOUND DO break; EXEC SQL FETCH c1 INTO : emp_number, :emp_name, :salary; print_rows (sqlca.sqlerrd2 - num_ret); num_ret=sqlca.sqlerrd2; if (sqlca.sqlerrd2 - num_ret)0) pr

37、int_rows(sqlca.sqlerrd2 - num_ret); EXEC SQL CLOSE c1; printf(nHave a good day.n); EXEC SQL COMMIT WORK RELEASE;void print_rows(int n) int i; printf(nNumber Employee Salaryn); printf(-n); for (i=0;i0:执行成功的状态值; 0:返回值为空, 忽略主变量的值; 0:主变量长度不够就被截断。3 WHENEVER语句WHENEVER是说明语句,不返回SQLCODE, 只是根据SQLCA中的返回码指定相关的措

38、施。格式为EXEC SQL WHENEVER SQLERROR|SQLWARNING|NOTFORUND STOP|CONTINUE|GOTO;其中(1)STOP|CONTINUE|GOT的缺省值为CONTINUE。(2)SQLERROR:SQLCA.SQLCODE0;(3)SQLWARNIGN:SQLCA.SQLWARN0=“W”;(4)NOTFOUND:SQLCA.SQLCODE=1403;下面给出一段程序来说明WHENEVER的用法: EXEC SQL BEGIN DEELARE SECTION;VARCHAR UID20;VARCHAR PASW20;EXEC SQL END DECL

39、ARE SECTION;EXEC SQL INCLUDE SQLCA;main() EXEC SQL WHENEVER SQLERROR GOTO ERR; EXEC SQL CONNECT :ID/:PWD; ; EXEC SQL DECLARE CSOR1 CURSOR FOR SELECT FORM EXEC SQL OPEN CSOR1; SQL ; EXEC SQL WHENEVER NOT FOUND GOTO good; for(;) EXEC SQL FETCH CSOR, INTO Good: ; printf(n查询结束n); EXEC SQL CLOSE C1; EXEC

40、 SQL WHENEVER SQLERROR CONTINUE; EXEC SQL COMMIT WORK RELEASE; exit(); Printf(n%70s/n, sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK WORK RELEASE: exit(1);(7) (7) 动态定义语句动态定义语句SQL语句分动态定义语句和静态定义语句两种:静态定义语句:SQL语句事先编入PRO*C中,在经过预编译器编译之后形成目标程序*。BOJ,然后执行目标程序预即可。动态定义语句:有些语句不能事先嵌入到PRO*C程序中,要根据程序运行情况,用户自己从输入设备上(

41、如终端上)实时输入即将执行的SQL语句。动态定义语句有:EXECUTE IMMEDIATE;PREPARE 与EXECUTE;PREPARE与FETCH 和 OPEN ;BIND与DEFINE DESCRIPTOR。EXECUTE IMMEDIATE语句此语句表示立即执行, 并且只向SQLCA返回执行结果,无其它信息。例如:EXEC SQL BEGIN DECLARE SECTION;VARCHAR abcd89;VARCHAR deay20;EXEC SQL END DECLARE SECTION;/* 输出字符串到abcd */EXEC SQL EXECUTE IMMEDIATE :abc

42、d;注意:1.EXECUTE IMMEDIATE只能运行带一个参数的动态语句。其中,abcd是参数,不是关键字。2.EXECUTE IMMEDIATE使用的先决条件是:SQL语句不能包含主变量;SQL语句不能是查询语句。3.可用任何主变量作为EXECUTE IMMEDIATE的参数;也可用字符串作为主变量。PREPARE与EXECUTE语句此语句表示“预编译/执行”。此语句能够预编译一次而执行多次。语法为:EXEC SQL PREPARE 语句名FROM:主变量;EXEC SQL EXECUTE语句名USING:替换主变量;PREPARE语句做两件事:预编译SQL语句;给出SQL语句的语句名。

43、注意:SQL语句不能是查询语句;PREPARE和EXECUTE可包含主变量;PREPARE不能多次执行。例如:#define USERNAME “SCOTT”#define PASSWORD “TIGER”#include EXEC SQL INCLUDE sqlca;EXEC SQL BEGIN DECLARE SECTION; Char * username=USERNAME; Char * password=PASSWORD; VARCHAR sqlstmt80; Int emp_number; VARCHAR emp_name15; VARCHAR job50;EXEC SQL END

44、 DECLARE SECTION;Main()EXEC SQL WHENEVER SQLERROR GOTO :sqlerror;EXEC SQL CONNECT :username IDENTIFIED BY :password;Sqlstmt.len=sprintf(sqlstmt.arr,”INSERT INTO EMP (EMPNO,ENAME,JOB,SAL) VALUES(:V1,:V2,:V3,:V4)”);Puts(sqlstmt.arr);EXEC SQL PREPARE S FROM :sqlstmt;For(;) printf(“nenter employee numbe

45、r:”); scanf(“%d”,&emp_number); if (emp_number=0) break; printf(“nenter employee name:”); scanf(“%s”,&emp_name.arr); emp_name.len=strlen(emp_name.arr); printf(“nenter employee job:”); scanf(“%s”,job.arr); job.len=strlen(job.arr); printf(“nenter employee salary:”); scanf(“%f”,&salary); EXE

46、C SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary; FETCH语句和OPEN语句FETCH语句和OPEN语句这组动态语句是对游标进行操作的,其执行过程如下:PREPARE语句名FROM 主变量字符串;DECLARE游标名FOR语句名;OPEN 游标名USING:替换变量1,:替换变量变FETCH游标名INTO: 主变量1,:主变量2CLOSE游标名注意:注意: SQLSQL语句允许使用查询语句;语句允许使用查询语句; SELECTSELECT子句中的列名不能动态改变,只能预置;子句中的列名不能动态改变,只能预置; WHEREWHE

47、RE和和ORDER BY ORDER BY 子句可以动态改变条件。子句可以动态改变条件。一、几个特殊文件一、几个特殊文件PROC在VC下开发Oracle库接口时,需要用到几个特殊文件。1、PROC的可执行文件PROCUI. EXE用Oracle_HOME代表Oracle安装后的根目录,当其以缺省方式安装在计算机的D盘时,则Oracle_HOME位置是D: Oracle。这时PROC的可执行文件在Oracle_HOME Ora81 BIN PROCUI. EXE,对缺省安装即在D: Oracle Ora81 BIN PROCUI. EXE。2、Oracle支持SQL在VC环境的库文件OraSQL

48、8. LIB根据以上约定,OraSQL8. LIB文件在Oracle_HOME Ora81 PRECOMP LIB MSVC OraSQL8.LIB,对缺省安装即在D: Oracle Ora81 PRECOMP LIB MSVC OraSQL8.LIB。3、Oracle支持SQL在VC环境的头文件根据以上约定,头文件 *.h在Oracle_HOME Ora81 PRECOMP PUBLIC *.h,对缺省安装即在D: Oracle Ora81 PRECOMP PUBLIC *.h。*.h 是头文件的总称,通常有十多个,具体内容可在指定路径下查到。二、将二、将PROCPROC集成到集成到VCVC

49、环境中环境中为了方便完成用PROC在VC下开发Oracle库接口,通常将PROC集成到Visual C+ 6.0 环境中,直接在C / C+环境中使用PROC预编译器来预编译应用程序,然后进行编译和链接,最终生成可执行程序。将PROC集成到VC环境中应完成如下工作。1、增加、增加PROC到到Tools菜单列表菜单列表2、指定头文件路径、指定头文件路径1 1、增加、增加PROCPROC到到ToolsTools菜单列表菜单列表a)运行Microsoft Visual C+ 6.0;b)从菜单项Tools中选择Customize项。为表述简单起见,书写成如下格式:菜单Tools/ Customize

50、 项。以下采用类似的表达方法。此时出现Customize对话框;c)单击Tools选项卡(或属性页),用鼠标移动“Menu contents”框滚动条到底部区域;d)双击点划线矩形区域,在空白区域上输入“PROC”,然后按回车键;e)在“Command”框中,输入PROC的可执行文件名。根据2.1节的说明,对缺省安装即输入D: Oracle Ora81 BIN PROCUI. EXE;f)在“Arguments”框中输入“$(TargetName)”。其作用在从菜单Tools中选择PROC项时,VC会将当前项目名传递给PROC,尔后PROC会直接打开该项目文件目录下扩展名为 .pre的同名文件

51、;g)在“Initial directory”框中输入“$(WkspDir)” / 单击“Close”按钮,完成将PROC集成到VC环境中的工作。2 2、指定头文件路径、指定头文件路径为了确保VC顺利完成编译链接,需要将Oracle提供的头文件增加到VC环境中。指定头文件路径的具体步骤如下。a) 菜单Tools / Options项,出现“Options”对话框;b) 单击“Directories”选项卡,从“Show directories for:”列表框中选择“Include files”;c) 移动“Directories”框的滚动条到底部区域;d) 双击点划线矩形区域,在空白区域上输

52、入包含Oracle支持SQL在VC环境头文件的子目录,根据2.3节的说明,对缺省安装即输入D: Oracle Ora81 PRECOMP PUBLIC。三、三、VCVC下开发下开发OracleOracle接口程序过程接口程序过程1、创建新工程2、创建预编译源文件3、预编译4、编译准备1 1、创建新工程、创建新工程下面叙述中,假定新建的工程名为:Exam01。当运行Visual C+ 6.0后,操作步骤如下:a)菜单File / New项 / Project卡;b)选择Win32 console Application 项;c)由浏览选择或直接输入工程将位于的路径 / 填入创建的工程名如Exam01;d)单击OK按钮 / 依缺省值单击Finish / 单击OK,完成创

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论