




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.3一些通用的嵌入式SQL l1、select 语句 l 不使用游标在程序中执行select语句,那么该查 询最多检索出一行记录。如果该查询检索到多于 一行的记录,系统将返回一个运行期错误。 l exec sql select all | distinct expr ,expr l into host-variable,host-variable l from tablename ,tablename . l where search_condition l2、declare cursor语句 l exec sql declare cursor_name cursor for l subquery l order by columnasc | desc,columnasc | desc l for read only | updateof colname,colname. l 子查询格式允许使用子句 group by 和 having l在最后一行的可选格式用于指明游标是read only 或update ,若缺省,当使用了order by,游标是 read only ,否则为update 。 l 注:在oracle中允许同时使用这两个格式,但改 为with readonly 在order by子句前面。 l故,若程序逻辑想通过游标更新或删除一条记 录,在游标声明中必须包括for update,在 lfor update 没有指定列,则被选到的列都被认 为是可更新的,若游标使用了for read only, 则不能通过该游标来更新或删除记录。 l 注:这里定义的游标只能在一个行集合中向 前移动,在SQL-99中新增了一个可滚动游标 。但oracle 和DB2 UDB不支持。这意味着要第 二次抽取某行记录,只能关闭后再打开游标。 通常情况下,游标在被再打开前必需先关闭。 l3、delete语句 l 有两种格式的delete语句,一种是定位删除:它 删除游标所在的当前记录;另一种是查找删除: 格式与交互式SQL中相同。 l exec sql delete from tablename name l where condition | where current of cursor_name l定位删除使用特殊语法:current of cursor_name l两种where条件是可选的。 l 长整型变量sqlca.sqlerrd2包含了删除操作所 影响到的行数。 l 在定位删除中,当删除执行后,游标指针加1 下移一行,若执行删除时,游标没有指向任意一 行,则whenever语句的not found 就成立。 l特别注意的是:在删除中约定的游标必须已经打 开并且指向一个实际的行,删除中的from必须同 选择游标时的from子句指向同一个数据源。此外 ,使用的游标必须是一个可更新的游标,不能被 声明为read only。 l 例5.3.1 从customers表中删除所有住在Duluth并 且没有订单的顾客记录。 使用查找删除: exec sql delete from customers c where c.city=Duluth and not exists (select * from orders o where o.cid=c.cid) l使用定位删除: l exec sql declare delcust cursor for l select cid from customers c where c.city=Duluth l and not exists(select * from orders o l where o.cid=c.cid ) l for update of cid l whenever not found goto skip; l exec sql open delcust; l while(true) l l exec sql fetch delcust into : cust_id; l exec sql delete from customers where current of delcust l l注:我们当然也可以创建一个游标检索所有没有 下过订单的顾客的city和cid,然后在程序逻辑中 测试if (strcmp(city,”Duluth”)=0),来判断该行是 否删除,但是,由于性能的原因,SQL在执行一 个检测时能够不带额外开销是最好的,(在宿主 程序与SQL中的切换是比较大的一个开销),我 们通常将尽量多的任务交给SQL去做。 l 故:大家思考,在例5.3.1中的定位删除与查找 删除,哪种效率更高? l4、update语句 l 与delete一样,有两种形式的update语句 l 查找更新和定位更新。 l exec sql update tablename name l set coluname= expr, coluname= expr l where condition | where current of cursor_name l长整型变量sqlca.sqlerrd2包含了更新操作所影响到 的行数。若没有行被影响到则whenever语句的not found 就成立。 l同delete一样,在定位更新中,约定的游标必须已经 打开并且指向一个实际的行,from必须同选择游标时 的from子句指向同一个数据源。此外,使用的游标必 须是一个可更新的游标,不能被声明为read only。 l5、insert语句 l insert语句与交互式的insert格式相同。 l exec sql insert into tablename(colum,colum) l values(expr,expr) | subquery ; l注:插入操作没有定位插入,新插入的行通常不 能被放在表中指定的位置,而是由表的磁盘结构 来决定位置。 l6、游标的打开、抽取、关闭 l exec sql open cursor_name; l exec sql fetch cursor_name into variable,variable l exec sql close cursor_name; l注:一般来说,若游标被打开了,就不能再次 打开,但oracle却可以例外处理。同样,关闭 一个没有打开的游标也会出错。当fetch语句执 行时遇到了一个空的活动行集或游标位于最后 一个活动行后面时,whenever语句的not found 条件成立。 l7、其他嵌入式SQL操作 l exec sql create table l exec sql drop table l exec sql connect l exec sql disconnect 5.4事务编程 l 大多数的数据库系统允许多用户同时访问同 一数据库的表。数据库系统也使用用户进程的概 念,通过允许多个进程同时访问数据。称为:“ 并发访问”。 l 显然,若不对并发访问进行控制,必然会导致 严重问题。 考虑数据的不一致性问题。 l 例5.4.1 假设一个存款人在表A中有两个银行帐 号ID,分别为A1和A2,来代表不同的行。帐户 基本信息的帐号用aid表示,该帐户现存的金额 用balance ,A1帐户上$900,A2 帐户上$100 ,若 进程p1想从帐号A1转帐$400到A2帐户上,该转 帐过程分三种状态: l l S1:A1.balance= = $900 ,A2.balance= =$100 , S2:A1.balance= = $500, A2.balance= =$100, S3:A1.balance= =$500, A2,balance= =$500, l现在我们看另外一个进程P2,它与进程P1同时运 行,该进程对存款人的存款额进行检查。若该储 户的存款总额大于$900,那么允许该储户办理信 用卡。那么,当两个进程并发执行,可能出现以 下情况: 进程P1进程P2 Update A set balance=balance-400 where A.aid=A1; update A set balance=balance+400 where A.aid=A2; int bal, sum=0; select A.balance into :bal from A where A.aid=A1; sum=sum+bal; select A.balance into :bal from A where A.aid=A2; sum=sum+bal; l进程P2在状态S2时,查询到该储户的存款总额 $600,称此为“不一致视图”。 l 为了避免访问这些不一致状态和由于并发访问 带来其他问题,数据库系统提供了一个特征,称为 :“事务”。 l 每个进程将一系列的数据库操作结合在一起, 这些操作构成了一个状态的一致性改变。这种数据 库操作包称为事务。支持事务的数据库系统给程序 员提供一些事务特性,保证程序的正确访问。 l l 1、隔离性保证 l 2、原子性保证 l 3、持久性保证 l1、隔离性保证 l 隔离性保证了即使是事务T1与事务T2同时执行 ,对于每个事务而言,各个事务是相互隔离的运 行在数据库系统上。即:在数据库系统中,T2在 T1进行转帐前进行,或T2在T1转帐完成后进行 ,T2看到的状态是S1或S3,不会看到S2,因而 不可能导致不一致视图。 l2、如何在程序中指定事务 l 成功连接到一个数据库后,在进程中并没有活 动的事务。通过执行任何对数据库行进行操作的 SQL语句(select、open cursor、update、insert、 delete)产生一个活动的事务。 在执行这些语句时,事务保持活动状态,直到程 序显示的执行如下两种嵌入式SQL语句之一来终 止事务: exec sql commit work;事务成功终止; exec sql rollback work;事务失败回滚; 关键字work在SQL-92中是可选的。若在程序结 束前对于一个事务既没有执行commit也没有执行 Rollback语句,那么将执行一个缺省的终止操作, 具体操作(commit或rollback)与产品有关。 l #include l #include ”prompt.h” lint main( ) l exec sql begin declare section ; l char acctfrom11,acctto11; l double dollars; l exec sql end declare section ; l char dollarstr20; l exec sql connect to default; l exec sql set transaction isolation level serializable; l l while (1) l while(prompt (“enter account and dollars :n”,3 l acctfrom,10,acctto,10,dollarstr,10)=0; l exec sql commit work; l break; lunitsgone: l exec sql rollback work; l l游标和事务 l 游标在一个作为原子的事务单元所执行的循环 中做一些细节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 协议书离婚财产可以分割
- 2025私人借款协议书
- 四方协议书要几份
- 忠诚协议书看法
- 污水排放协议书
- 终止合伙协议书
- 物品损害赔偿协议书
- 中韩停火协议书
- 为什么台湾反对服贸协议书
- 2025石油采购合同
- 中考英语复习语法专项讲练06现在完成时含解析
- 2025年甘肃瓮福化工有限责任公司招聘笔试参考题库含答案解析
- 9古诗三首《题西林壁》《雪梅》教学实录-2024-2025学年统编版语文四年级上册
- 初二年段长会议发言稿
- 人教版语文必修上册 第一单元测试卷(含答案)
- 中建基础设施公司“主要领导讲质量”
- 生物-辽宁省名校联盟2024年高一10月份联合考试试题和答案
- 野生菌中毒和误食野果中毒防治知识安全课
- 新人教版四年级上册道德与法治全册复习资料知识点
- 辅警考试题《公安基础知识》综合能力测试题(附答案)
- JTG 3362-2018公路钢筋混凝土及预应力混凝土桥涵设计规范
评论
0/150
提交评论