您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > ORACLE培训教材之第三讲
1/16Pro*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。C局部变量说明程序体内部说明部分内部说明段2/16通讯区说明函数KC的可执行语句可执行语句SQL的可执行语句或PL/SQL块二.Pro*C程序的组成结构每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体应用程序首部定义了ORACLE数据库的有关变量,为在C语言中操纵ORACLE数据库做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。应用程序的组成结构如图所示:EXECSQLBEGINDECLARESECTION(SQL变量的定义)EXECSQLENDDECLARESECTION;EXECSQLINCLUDESQLLA;EXECSQLCONNECT:用户名IDENTIFIEDBY:口令SQL语句及游标的使用1.应用程序首部应用程序的首部就是Pro*C的开始部分。它包括以下三部分:C变量描述部分;SQL变量描述部分(DECLARE部分);SQL通信区。(1).DECLARE部分(描述部分)描述部分说明程序的SQL变量,定义部分以EXECSQLBEGINDECLARESECTION;开始和以EXECSQLENDDECLARESECTION;结束的。它可以出现在程序的主部,也可出现在局部SQL变量的说明和使用在说明段能为SQL变量指定的数据类型如表所示:数据类型描述CHARCHAR(n)INTSHORTLONGFLOATDOUBLE单字符n个字符数组整数短整数单精度浮点数双精度浮点数描述部分SQL通信区应用程序体应用程序首部3/16VARCHAR变长字符串这些数据类型实际上就是C语言的数据类型,其中VARCHAR中视为C数据类型的扩充。这在以后会谈到。SQL变量的使用应注意以下几点:必须在描述部分明确定义必须使用与其定义相同的大小写格式在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C语句中引用时不需加冒号。不能是SQL命令中的保留字。可以带指示变量。例如:EXECSQLBEGINDECLARESECTIONS;VARCHARprograme[30];Intporgsal,pempno;EXECSQLENDDECLARESECTION;EXECSQLSELECTENAME,SALINTO:programe,:progsalFROMEMPWHEREEMPNO=:pempno;(2).指示器变量的说明和引用指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充当输入或输出的变量)。每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL)指示器变量的说明基本同一般SQL变量一样,但必须定义成2字节的整型,如SHORT、INT。在SQL语句中引用时,其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。当指示器变量为-1时,表示空值。例如:EXECSQLBEGINDECLARESECTION;INTdept-number;SHORTind–num;CHARemp–name;EXECSQLENDDECLARESECTION;Scanf(“90d%s”,&dept-number,dept–name);If(dept–number==0)Ind–num=-1;ElseInd–num=0;EXECSQLINSERTINTODEPT(DEPTNO,DNAME)VALUES(:dept–number:ind-num,:dept–name);其中ind–num是dept–number的指示器变量。当输入的dept–number值是0时,则向DEPT表的DEPTNO列插入空值。4/16(3).指针SQL变量的说明和使用指针SQL变量在引用前也必须在DECLARE部分先说明。其说明格式同C语言。在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。在C语句中用法如同C语言的指针变量。(4).数组SQL变更的说明和引用在SQL语句中引用数组时,只需写数组名(名字前加冒号),不需写下标,在C语句中用法如同C语言的数组变量。使用数组可大大降低网络传输开销。如要向一表插入100行数据,如果没有数组,就要重复100次,而引用后,只须执行一次insert语句、便可一次性插入。例如:EXECSQLBEGINDECLARESECTION;Intemp_number[100];Charemp_name[100][15];Floatsalary[100],commission[100];Intdept_number;EXECSQLENDDECLARESECTION;….EXECSQLSELECTEMPNO,ENAME,SAL,COMMINTO:emp_number,:emp_name,:salary,:commissionFROMEMPWHEREDEPTNO=:dept_number;在使用数组时,应注意以下几点;不支持指针数组只支持一维数组,而emp-name[100][15]视为一维字符串数组最大维数为32767在一条SQL语句中引用多个数组时,这些数组维数应相同在VALUES,SET,INTO或WHERE子名中,不允许把简单SQL变量与数组SQL变量混用不能在DELARE部分初始化数组例如:下面的引用是非法的EXECSQLBEGINDECLARESECTION;Intdept–num[3]={10,20,30};EXECSQLENDDECLARESECTION;EXECSQLSELECTEMPNO,ENAME,SALINTO:emp–num[i],:emp–name[i],:salarg[i]FROMEMP(5)伪类型VARCHAR的说明和引用VARCHAR变量在引用之前也必须在说明段说明,说明时必须指出串的最大长度,如:EXECSQLBEGINDECLARESECTION;Intbook–number;VARCHARbook–name[50];5/16EXECSQLENDDECLARESECTION;在预编绎时,book–name被翻译成C语言中的一个结构变量;Struct{unsignedshortlen;Unsignedchartarr[20];}boo–name由此看出,VARCHAR变量实际上是含长度成员和数组成员的结构变量。在SQL语句中引用时,应引用以冒号为前缀的结构名,而不加下标,在C语句中引用结构成员。VARCHAR变量在作输出变量时,由ORACLE自动设置,在作为输入变量时,程序应先把字符串存入数组成员中,其长度存入长度成员中,然后再在SQL语句中引用。例如:Main(){.......scanf(“90s,90d’,book–name.arr,&book–number);book–name.len=strlen(book–name.arr);EXECSQLUPDATEBOOKSETBNAME=:book–name;BDESC=:book–number;}(6)SQL通信区SQL通信区是用下列语句描述的:EXECSQLINCLUDESQLCA;此部分提供了用户运行程序的成败记录和错误处理。SQLCA的组成SQLCA是一个结构类型的变量,它是ORACLE和应用程序的一个接口。在执行Pro*C程序时,ORACLE把每一个嵌入SQL语句执行的状态信息存入SQLCA中,根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示:Structsqlca{charsqlcaid[8];----标识通讯区longsqlabc;---通讯区的长度longsqlcode;---保留最近执行的SQL语句的状态码struct{unsignedshortsqlerrml;-----信息文本长度}sqlerrm;charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];}structsqlcasqlca;其中,sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。程序员根据这些状态码做出相应的处理。这些状态码值如下:0:表示该SQL语句被正确执行,没有发生错误和例外。6/160:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。当出现此类错误时,当前事务一般应回滚。2.应用程序体在Pro*C程序中,能把SQL语句和C语句自由地混合书写,并能在SQL语句中使用SQL变量,嵌入式SQL语句的书写文法是:以关键字EXECSQL开始以C语言的语句终结符(分号)终结SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,输出和数据处理等。(1)连接到ORACLE数据库在对数据库存取之前,必须先把程序与ORACLE数据库连接起来。即登录到ORACLE上。所连接命令应该是应用程序的第一个可执行命令。连接命令格式如下:EXECSQLCONNECT:用户名IDENTIFIEDBY:口令或EXECSQLCONNECT:用户名/口令在使用上述两种格式进行登入时,应当首先在说明段定义包含用户名和口令的SQL变量,并在执行CONNECT之前设置它们,否则会造成登录失败。例如:EXECSQLBEGINDECLARESECTION;VARCHARusename[20];VARCHARpassword[20];EXECSQLENDDECLARE..........strcpy(usename.arr,“CSOTT’);usename.len=strlen(username.arr);strcpy(password.arr,“TIGER’);password.len=strlen(password.arr);EXECSQLWHENEVERSQLERRORGOTOSQLERR;EXECSQLCONNECT:usernameINDNTIFIEDBY:password;注意:不能把用户名和口令直接编写到CONNECT语句中,或者把用引号(’)括起来的字母串在CONNECT语句中,如下面的语句是无效的。EXECSQLCONNECTSCOTTINENTIFIEDBYTIGER;EXECSQLCONNECT
本文标题:ORACLE培训教材之第三讲
链接地址:https://www.777doc.com/doc-2886571 .html