




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
访问数据库的程序,在现实中,直接通过SQL访问数据库的最终用户并不多,大多数用户仍然通过应用程序接口访问数据。此外,非过程性的SQL语句能力有限,还有一些任务需要写一组SQL语句来读取不同的行,然后根据所读到的内容来更新其中的某些行,这时必须保证其他用户所做的修改不会破坏结果。我们需要将这一组SQL语句捆绑在特定的不可分割的包内,即事务。,嵌入式SQL是指在程序内执行的SQL语句,它强调这些SQL语句是“嵌入”在编程语言的常规语句中的。Java中标准的嵌入式SQL称为SQLJ,可以在ORACLE、INFORMIX、DB2UDB中使用,也可以通过JDBC在Java中使用,JDBC是标准Java的一部分,用来连接任何数据库。我们将重点放在C语言编写的嵌入式SQL程序。在本章中,我们将会碰到两种数据库系统的差别,即oracle和db2udb,5.1C语言中嵌入SQL的介绍,关键词execsql声明SQL语句嵌入到宿主语言源文件中。例如:execsqlselectcount(*)into:host_varfromcustomers;注:1、execsql可以扩展到该文件的多行。2、在嵌入式SQL中使用宿主变量时必须加(:)例:假如字符串变量cust_id在C程序中被赋值为“c001”,execsqlselectcname,discntinto:cust_name,:cust_discntfromcustomerswherecid=:cust_id则检索到顾客编号为c001的顾客的名字和折扣率,并将它们分别赋值给变量cust_name,cust_discnt。当然,要在嵌入式SQL中使用这些宿主变量,必须先声明它们,包括对预编译程序的声明。,execsqlbegindeclaresection;charcust_id5=“c001”;charcust_name14;floatcust_discnt;execsqlenddeclaresection;这三个变量的声明是标准的C语言中的声明,出现在begindeclare和enddeclare语句之间,这是预编译程序和C语言程序都能理解的相同的格式。嵌入式SQL中使用的宿主变量必须能被数据库系统识别。,在SQL中建立和释放数据库连接:考虑怎样与数据库管理系统建立数据库连接。在FullSQL-99中连接到SQL数据库的语法:execsqlconnecttotarget-serverasconnect-nameuserusername或execsqlconnecttodefaulttarget-server是目标数据库名,connect-name是对这次该数据库连接的一个名字,以后当再次使用是,可以直接引用它;username是该数据库的一个合法用户名。connecttodefault是默认数据库的连接。,由于不同平台在用户识别、权限要求方面的可变性,connect语句并不是EntrySQL-92和CoreSQL-99的一部分。在ORACLE和DB2UDB中,字符串常量通常不能直接作为connect语句的参数,我们需要首先声明:execsqlbegindeclaresection;charuser_name10,user_pwd10;execsqlenddeclaresection;设口令“1234”,我们对上述变量初始化:strcpy(user_name,”cap”);strcpy(user_pwd,”1234”);,那么在DB2中嵌入式SQL的Connect语句为:execsqlconnecttocap:user_nameusing:user_pwd;在ORACLE中嵌入式SQL的Connect语句为:execsqlconnect:user_nameidentifiedby:user_pwd;简单的断开连接:execsqldisconnectcurrent/connect_name;注意:在断开连接之前,必须对成功的事务提交确认,或是对失败的事务回滚以撤消已做的工作,否则直接断开连接会失败。,对成功的任务结束为:execsqlcommitwork;execsqldisconnectcurrent;对失败的任务结束则为:execsqlrollbackwork;execsqldisconnectcurrent;在ORACLE中可以使用execsqlcommitrelease;或execsqlrollbackrelease;,例5.1.1实现一个嵌入式SQL程序,要求程序不断提示用户输入一个顾客的cid,显示该顾客的名字和折扣,当用户输入一个空字符串则程序终止。程序头如下:#include#include”prompt.h”/*headerfordbssqlcastructure*/execsqlincludesqlca;charcid_prompt=“pleaseentercustomerid”;,程序主体代码:intmain()execsqlbegindeclaresection;charcust_id5,cust_name14;floatcust_discnt;charuser_name20,user_pwd20;execsqlenddeclaresection;execsqlwheneversqlerrorgotoreport_error;execsqlwhenevernotfoundgotonotfound;strcpy(user_name,”cap”);strcpy(user_pwd,”1234”);execsqlconnect:user_nameidentifiedby:user_pwd;,while(prompt(cid_prompt,1,cust_id,4)=0)execsqlselectcname,discntinto:cust_name,:cust_discntfromcustomerswherecid=:cust_id;execsqlcommitwork;printf(“customersnameis%sanddiscntis%5.1f”,cust_name,cust_discnt);continue;notfound:printf(“cantfind%s“,cust_id)execsqlcommitrelease;return0;report_error:print_dberror();execsqlrollbackrelease;return1;,程序说明:print_dberror()函数显示数据库系统的错误消息,如ORACLE中的“ORA-00942:tableorviewdoesnotexist”。prompt函数提示用户交互,prompt函数也可以接受用户输入的多个标记,若用户在提示行上键入回车,则返回结果小于0。C语言编译程序不能识别嵌入式execsql语句的语法,所以源程序必须先通过预编译程序将其转换成C中的正确语句。(参见附录B.3)Whenever语句是条件处理语句,该语句使我们在遇到出错和其他情况时,控制程序的运行。,其格式如下:execsqlwheneverconditionaction;例execsqlwheneversqlerrorgotoreport_error;Whenever设置了一个条件陷阱,这样会对所有后面由execsql语句引起的对数据库系统的调用自动检查是否出错条件,若存在这样的出错条件,就必须采取规定的动作。(1)条件sqlerror这些错误通常是由编程错误引起的。并且错误代码依赖于某一特定的DBMS。notfound执行某条SQL语句,如insert、delete、update等,检测是否没有记录受到该SQL语句的影响。,sqlwarning检测不是错误但应该引起注意的条件。注意:sqlwarning不是FullSQL-92的标准。(2)动作continue不采取任何动作,程序按正常流程goto标号等同与C语言中的“goto标号”stop结束程序的运行,撤消当前的事务,断开与数据库的连接do函数(ORACLE)、call函数(INFORMIX)引发一个对已经命名的C函数的调用,这一函数返回后,程序从引发该变迁的execsql语句之后继续执行下去。,注意:当遇到一条后续的whenever语句覆盖了前面的whenever语句时,程序动作就被改变了。例5.2.1main()execsqlwheneversqlerrorstop;execsqldelete*fromagentswhereaid=a03gotos1;execsqlwheneversqlerrorcontinue;s1:execsqlupdateagentssetpercent=percent+1;.,注意:在没有whenever时,缺省动作是continue;可以通过execsqlwheneversqlerrorcontinue来重建这一缺省动作。我们在使用whenever语句时要注意避免无限循环。例:execsqlwheneversqlerrorgotohandle_error;execsqlcreatetablecustomers(cid);由于某个错误(磁盘空间不够等)导致建表失败,控制流转入handle_errorhandle_error:有问题吗?execsqldropcustomers;execsqldisconnect;return1;,删除表时,可能会引起无限循环。故应改为:handle_error:execsqlwheneversqlerrorcontinue;execsqldropcustomers;execsqldisconnect;return1;,SQL通信区:SQLCASQL通信区,称为SQLCA,是一个已经被声明过的内存结构(C中的结构),它的成员变量用来在数据库系统监视器与程序之间进行信息通信。SQLCA在嵌入式的C程序中声明,通常写在其他的外部声明语句前面。execsqlincludesqlca;实际上,whenever机制的基础是一个提供了更多与条件有关的信息的错误编码系统。支持SQLCA的产品要填写sqlca.sqlcode(一个与错误码相关的变量),注意:SQL-92、SQL-99等标准支持一种新的报告错误的方法,SQLSTATE。在ORACLE中,必须预处理程序运行时设置MODE=ANSI才能支持。在DB2UDB中提供SQLSTATE作为SQLCA的一个成员。SQLSTATE是由一个5个字符的字符串编码组成,前两个字符为“类别编码”,后3个字符为“子类编码”。例如:“00000”代表没有错误,“82100”表示“内存溢出”,对于所有的产品这一编码都是相同的。,若whenever语句中采取的动作不是continue,那么要进行显示的错误检测是不行的。,例5.2.3考虑如下代码段:execsqlwheneversqlerrorgotohandle_error;execsqlcreatetablecusts(cidchar(4)notnull,cnamevarchar(13),.);if(strcmp(sqlca.sqlstate,”82100”)=0)注意:虽然预处理程序在createtable之后立即设置了sqlerror检测,但是该错误渐次将永远不会执行。为什么?如何修改?,execsqlwheneversqlerrorgotohandle_error;.execsqlwheneversqlerrorcontinue;execsqlcreatetablecusts(cidchar(4)notnull,cnamevarchar(13).);if(strcmp(sqlca.sqlstate,”82100”)=0)elseif(strcmp(sqlca.sqlsqlstate,”00000”)!=0)gotohandle_error;execsqlwheneversqlerrorgotohandle_error;,使用游标选择多行只有当select语句保证每次最多读一行到一个列变量的集合时,才能使用例5.1.1中的嵌入式select语句格式。我们在程序中如何对检索到的多行进行处理呢?一次一行原则从一条select语句中,我们总是每次查看一行,每次从记录集中检索一行,需要一个游标记录当前位置。,例如,对一个用户交互提供的一个特定的顾客的编号cust_id,我们需要检索出为该顾客提供定货的代理商aid,以及每个代理商所提供给顾客的定单金额总值。,Execsqlselectaid,sum(dollars)fromorderswherecid=:cust_idgroupbyaid,下面,我们为这段select语句声明一个名为agent_dollars的游标。,Execsqldeclareagent_dollarscursorforselectaid,sum(dollars)fromorderswherecid=:cust_idgroupbyaid,注意:在游标被声明后,它仍然不是active状态。之后,必须激活该游标:,execsqlopenagent_dollars;,执行程序在碰到该激活语句,向数据库系统检测器发出一个调用,以执行该游标声明的select语句,将查询的结果集保存在数据库系统为该游标创建的系统缓冲区中。,然后,我们可以使用fetch语句从该缓冲区中检索连续的记录行:execsqlfetchagent_dollarsinto:agent_id,:dollar_sum,当一个游标所有的fetch语句都执行之后,应该执行closecursor语句,关闭游标,释放资源。注:游标中保持一个当前指针,该指针总是指向最近刚刚被检索到的行,在随后的提取调用中,游标的位置指针首先加1,然后这条记录中的值被检索到指定的宿主变量中去。,例5.1.2下面给出了一个检索多行的程序:groupbyselect语句列出了代理商的ID值,以及由这些代理商提供给某一用户指出的顾客的定单金额总值。注:该程序是按照DB2UDB的格式,#inclued.execsqlincludesqlca;execsqlbegindeclaresection;charcust_id5,agent_id4;doubledollar_sum;execsqlendde
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 线下演出市场复苏中的艺人个人品牌塑造与传播报告001
- 探索2025年开放银行生态构建中的金融科技与金融科技企业可持续发展研究报告
- 新药研发新方向2025:靶点发现与验证技术实战解析
- 2025年天然植物精油护肤品牌市场拓展与品牌合作案例报告001
- 汽车行业供应链金融风险防范与优化:2025年风险防范策略案例报告001
- 2025年医药行业研发外包(CRO)模式下的质量控制与持续改进报告
- 2025年医药行业CRO模式下的临床试验数据管理与分析报告
- 城市商业综合体智能化系统设计与智慧家居评估报告
- 2025年医药企业研发外包(CRO)模式药物研发医疗器械研发与注册报告
- 2025年体检行业市场前景展望与服务质量提升策略报告001
- 学校预防性侵教育活动开展情况总结
- 广州版四年级英语下册各单元知识点归纳及同步练习
- 广东省廉江市实验学校2022-2023学年数学五年级第二学期期末联考试题含答案
- 湖南三支一扶考试历年真题
- 心肺运动试验-PPT-医学课件
- 2023年小学数学压轴几何图形经典30题汇编
- 农业推广经营服务相关知识
- 铁路工程预算定额标准说明
- 灭火和疏散应急预案流程图
- 2023-2024学年云南省景洪市小学语文四年级期末评估试题
- 强夯施工工艺流程图
评论
0/150
提交评论