oracle train在ORACLE数据库管理和系统中有三种访问的方法_第1页
oracle train在ORACLE数据库管理和系统中有三种访问的方法_第2页
oracle train在ORACLE数据库管理和系统中有三种访问的方法_第3页
oracle train在ORACLE数据库管理和系统中有三种访问的方法_第4页
oracle train在ORACLE数据库管理和系统中有三种访问的方法_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

Pro*C的使—Pro*C什么是Pro*C程在ORACLE数据库管理和系统中,有三种数据库的方法用SQL*Plus,它有SQL命令以交互的应用程序数据库用第四代语言应用开发工具开发的应用程序数据库这些工具有SQL*Froms,QL*Reportwriter,SQL* SQLORACLE库函数调用来。Pro*CC和非过程化语言SQLSQLSQL语言可以完成动态地建立、修改和删除数据库中的Pro*CPL/SQLPro*C通俗来说,Pro*CSQLPL/SQLC程序,CSQLPL/SQL块,所以它还含有与之不同的成份。为了让大家对Pro*C有个感性的认识,特将二者差别比较如C

C1:同函数K。函数

C的局部变量说明

C外部说明段(ORACLE变量说明)Pro*C

1:同函数K。2:同函数K

C

CSQL的可执行语或二.Pro*C(1)(2)应用程序首部定义了ORACLE数据库的有关变量,为在C语言中ORACLEPro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。EXECSQLEXECSQLBEGINDECLARE(SQL变量的定义EXECSQLENDDECLAREEXECSQLINCLUDEEXECSQLCONNECT:<用户名IDENTIFIEDBY:<SQL描述部应用程序首应用程序应用程序首应用程序的首部就是Pro*CCSQL变量描述部分(DECLARE部分SQL(1)DECLARE部分(描述部分描述部分说明程序的SQLEXECSQLBEGINDECLARESECTION;EXECSQLENDDECLARESECTIONSQL在说明段能为SQLn个字符数组这些数据类型实际上就是CVARCHARC数据SQL(句中时不需加冒号。不能是SQL例如:EXECSQLBEGINDECLAREIntporgsal,pempno;EXECSQLENDDECLAREEXECSQLSELECTENAME,INTO:programe,:progsal WHEREEMPNO=:(2).指示器变量的说明和指示变量实际上也是一类SQL变量,(SQL。每一个宿主变量都可定义一个指SQL2字节的整“”(C语句中,可独立使用。当指示器变量为-1时,表示空值。例如:EXECSQLBEGINDECLARESECTION dept-number;SHORTind–num; emp–name;EXECSQLEND SECTIONScanf(“90d%s”,&dept-number,dept–name); (dept–number==0)Ind–num=-Ind–num=EXECSQLINSERTINTODEPT(DEPTNO,VALUES(:dept–number:ind-num,:dept–其中indnum是deptnumber的指示器变量。当输入的deptnumber值0DEPTDEPTNO列插入空值。(3).指针SQL指针SQL变量在前也必须在DECLARE部分先说明其说明格式同C“(“*(号CC语言的指针变量。(4).数组SQL变更的说明和在SQL语句中数组时只需写数组(名字前加冒号,不需写下标,在CC语言的数组变量。100行数据,如果没 EXECSQLSELECT INTO:emp_number,:emp FROMEMPWHEREemp-name[100][15]在一条SQL语句中多个数组时,这些数组维数应相VALUESSETINTO或WHERESQL变量与数组SQL变量混用DELARE例如:下面的是EXECSQLBEGINDECLARE dept–num[3]=EXECSQLENDDECLARESECTIONEXECSQLSELECTEMPNO,ENAME,INTO:emp–num[i],:emp–name[i],:salarg[i]FROMEMPVARCHAR变量在之前也必须在说明段说明,说明时必须串EXECSQLBEGINDECLARE book– book–name[50EXECSQLENDDECLARESECTIONbook–name被翻译成CStruct{unsigned shortlen; chartarr[20];}boo–VARCHAR变量实际上是含长度成员和数组成员的结构变量。在SQL语句中时,应以冒号为前缀的结构名,而不加下标,在C语句中结构成员。VARCHARORACLE量时,程序应先把字符串存入数组成员中,其长度存入长度成员中,然后再在SQL语句中。例如:Main( scanf(“90s,90d’,book–name.arr,&book–number);book–name.len=strlen(book–name.arr);EXECSQLUPDATESETBNAME=:book–name;BDESC=:book–number}SQL通信SQLEXECSQLINCLUDESQLCA的组SQLCAORACLE和应用程序的一个接口。Pro*CORACLESQL语句执行的状态信息存SQLCASQL语句的执行是否成功,处理的行Struct{charsqlcaid8 →long ---→long →保留最近执行的SQLstruct →charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];}structsqlcasqlcodeSQL语句的状态0:表示该SQL>0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据<0:表示由于数据库、系统、网络或应用程序的错误,ORACLESQLPro*CSQLC语句中使用SQL变量,嵌入式SQL以关键字EXECSQL以C语言的语句终结符(分号)SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,ORACLEORACLE上。所连接命令应该是应用程序的第一个可执行命令。连接命令格EXECSQL 用户 IDENTIFIEDBY:<口令或EXECSQLCONNECT: 用户名 口令SQL变量,并在执行CONNECTEXECSQLBEGINDECLARESECTION usename[20]; EXECSQLENDstrcpy(usename.arr,“CSOTT’);usename.len=strlen(username.arr);strcpy(password.arr,“TIGER’);password.len=strlen(password.arr);EXECSQLWHENEVERSQLERRORGOTOEXECSQLCONNECT:usernameINDNTIFIEDBY:注意:不能把用户名和口令直接编写到CONNECT()EXECSQLCONNECTSCOTTINENTIFIEDBYTIGER;EXECSQLCONNECT‘SCOTTIDENTIFIEDBY‘TIGER’;在讲述SQL在PRO*C中,查询可分为两种类型返回单行或定行数的查询用数组1)返回单行或定行数的查在PRO*C中的查询SQLSELECT语句由以下几个子句组成:CONNECTBYGROUPBYORDERBYWHERE子句中的查询条件可以是一个属性或多个属性的集合,在执行WHERE子句中.WHERE子句中所用的主变量称为输SELECTEMPNO,JOB,SALINTO:PNAME,:PJOB,:PSALFROMEMPWHERE若没有找到限定的行,则SQLCA.SQLCODE返回 ”,表明”没有找到”INTO在任何项送给主变量之前,都要求ORACLE把这些项转换成主变量的数据类型。对于数字是通过截断来完成的(如:9.239SELECT语句增INTOINTOFROM之前的查询中有多少个SELECT项中表达式的数目不等于INTO子句中主变量的数目,就把SQLCA.SQLWARN[3]置为”W”。2)的SELECT语句。ORACLEPRO*C存放查询结果的工作区域。一个游标(已命名(1DECLARECUSOR(3)FETCH(4)COSEEXECSQLDECLARE〈游标名〉CORSORSELECT〈列〉 EXECSQLDECLARECSOR,CURSORSELECTENAME,JOB,SALFROMEMPWHERE当赋给一个与查询相关联的游标CURSORSELECT查询EMP时可从数据库中返回多行,这些行就是CURSOR的一个活动区域。PRO*C不能没有定义的游标OPEN中使用的主变量。打开游标的语句是:EXECSQLOPEN一组是一个一个返回的,查询完成后,游标就可关闭了。如图所示: 注意:1)2)EXECSQLFETCH〈游标名〉INTO12,……FETCH的工作过程如图所示:FETCH只有在游标打开之后才能取数据,即执行FETCHFETCH每SQLCA(=1403在C程序中可以开辟一个内存空间,来存放操作结果,这样就能利用开辟的空间来灵活查询的结果。EXECSQLCLOSEEXECSQLCLOSEORACLEV5.0版支持SQL格式“CURRENTOFCURSOR。这条语句将指向 取出的行,以用于修改和删除操作该语句必须有取操作之后使用, 一个ROWID,并使用它。EXECSQLDECLARESALESPEOPLECURSORFORSELECTSSNO,NAME,SALARYFROMEMPLOYEEDNAME=‘SalesEXECSQLOPENEXECSQLFETCH:SS:NAME:SAL;EXECSQLCLOSESALESPEOPLE;(5)SQL嵌入SQL与交互式SQLSQL语句前增加前缀“EXECSQL小小的差别其目的是在于预编译时容易识别出来以便把每一条SQL作为一条高级语言来处理。每一SQL语句分为说明性语句和可执行语句两大类。可执行语句又可执行性SQLSQL语句写在高级例如:在PRO*C程序中建立一个名为BOOKEXECSQLBEGINDECLAREVARCHARuid[20],EXECSQLENDDECLARESECTION;EXECSQLINCLUDESQLCA;{/*logindatabase*/EXECSQLCONNECT:uidIDENTIFEED(acqnumnumber,copiesnumber,pricenumber);EXECSQLCOMMITWORKRELEASE;PRO*C可非常简便灵活地ORCLE数据库中的数据,同时又具有C语言SQL嵌套源程序示例typedefcharasciz[20];EXECSQLBEGINDECLAREEXECSQLTYPEascizISSTRING(20) ascizpassword;ascizemp_name(5);intemp_number(5a);floatsalary[5];EXECSQLENDDECLARESECTION;EXECSQLINCLUDEsqlca;Voidsqlerror();{intnum_ret;strcpy(password,“TYGER”);EXECSQLWHENEVERSQLERRORDOEXECSQLCONNECT:usernameIDENTIFIEDBY:password;Print(“\nConnectedtoORACLEasuser:%s\n”,username);EXECSQLDECLAREc1CURSORFORSELECTEMPNO,ENAME,SALFROMEMP;EXECSQLOPENc1;Num_ret=0;{EXECSQLWHENEVERNOTFOUNDDOEXECSQLFETCHc1INTO:emp_number,:emp_name,:salary;Print_rows(sqlca.sqlerrd[2]–num_ret);}if((sqlca.sqlerrd[2]–num_ret)>0);print_rows(sqlca.sqlerrd[2]–num_ret);EXECSQLCLOSEc1;Printf(“\HaveagoodEXECSQLCOMMITWORK}voidprint_rows(n);intn;{intprintf(“\nNumberEmployeefor(i=0;i<n;i++

printf(“%-9d%-8s%9.2f\n”,emp-number[i],emp---}void{EXECSQLWHENEVERSQLERRORPrintf(“\noracleerrordetected:\n”);Printf(‘\n%.70s\n”,sqlca.sqlerrm.sqlerrmc);EXECSQLROLLBACKWORKRELEASE;}在使用SQL语句和PRO*C对数据库进行操作时,常常有字段空值,无条件删SQLCA和指示器变1SQLCA在PRO*C程序中SQLCASTRUCTCharsqlcaid[8]; UnsignedCharCharLongCharChar}SQLCA.sqlerrm.sqlerrmcSQLCA。SQLCODESQLCA.sqlerrd:ORACLESQLCA.SQLERRD[2]有DML语句处理的行数。在每执行一个SQL语句后,ORACLE就把返回结果放入SQLCA中,但说用SQLCA可以查看SQL 2指示器变量有时也称指示变量.指示变量与一个主变量相关联,主变量的返=0:返回值不为空,未被截断,值放在主变量中; >0:返回值为空,忽略主变量的值;在WHERENULL属性来测试空值。WHEREENAMEISWHERE指示变量在插入空值之前为—3WHENEVERWHENEVERSQLCODESQLCA中的返EXECSQLWHENEVER(1)[STOP|CONTINUE|GOT<标号>]的缺省值为CONTINUE下面给出一段程序来说明WHENEVER的用法:EXECSQLBEGINDEELARESECTION;VARCHARUID[20];VARCHAREXECSQLENDDECLARESECTION;EXECSQLINCLUDESQLCA;{EXECSQLWHENEVERSQLERRORGOTOERR;EXECSQLCONNECT:UID/:PWD;EXECSQLDECLARECSOR1CURSORSELECTFORM〈表EXECSQLOPENCSOR1;EXECSQLWHENEVERNOTFOUNDGOTOEXECSQLFETCHCSOR,printf(“\n查询结束\n”);EXECSQLCLOSEC1;EXECSQLWHENEVERSQLERRORCONTINUE.EXECSQLCOMMITWORKRELEASE:Printf(“\n%70s|n”,sqlca.sqlerrm.sqlerrmc);EXECSQLROLLBACKWORKRELEASE:}动态定义语SQL静态定义语句:SQL语句事先编入PRO*C中,在经过预编译器动态定义语句:有些语句不能事先嵌入到PRO*C程序中,要根SQL语句。EXECUTEPREPARE与PREPARE与FETCHOPENBIND与DEFINEDESCRIPTOREXECUTEIMMEDIATESQLCAEXECSQLBEGINDECLARESECTION;VARCHARabcd[89];VARCHAREXECSQLENDDECLARE 输出字符串到 EXECSQLEXECUTEIMMEDIATEEXECUTEIMMEDIATEabcdEXECUTEIMMEDIATE使用的先决条件是:SQL语句不能包含主变量;SQL语句不能是查询语句。EXECUTEIMMEDIATE的参数;也可用字符PREPARE与EXECUTEEXECSQLPREPARE〈语句名〉FROM:主变量;EXECSQLEXECUTE〈语句名〉[USING:替换主变量];PREPARE语句做两件事:预编译SQL给出SQL语句的语句名。SQLPREPARE和EXECUTEPREPARE不能多次执行。

温馨提示

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

评论

0/150

提交评论