数据库设计与开发(北邮软件学院研究生讲义).ppt
《数据库设计与开发(北邮软件学院研究生讲义).ppt》由会员分享,可在线阅读,更多相关《数据库设计与开发(北邮软件学院研究生讲义).ppt(47页珍藏版)》请在三一办公上搜索。
1、北京邮电大学软件学院 郭文明 2003.06,3.数据库应用程序体系结构,数据库系统是指在计算机系统中引入数据库后的系统,一般由数据库、数据库管理系统、应用系统、DBA、用户组成。本章介绍数据库应用程序的数据访问与数据库应用系统的体系结构。3.1嵌入式SQL 3.2事务处理技术 3.3数据库应用系统体系结构 3.4中间件,北京邮电大学软件学院 郭文明 2003.06,3.1 嵌入式SQL,为什么使用嵌入式SQL?有些数据访问任务对于交互式的非过程的SQL是无法完成的任务。使用交互式SQL,必须知道表名、列名并且能够写出符合语法的SQL语句。实际的应用系统是非常复杂的,数据库访问只是其中一个部件
2、。有些动作如与用户交互、图形化显示数据等只能用高级语言实现。嵌入到过程性主语言中使用的SQL称为嵌入式SQL。主语言可以是C或Java(不一定是Windows环境).也可以是Visual Basic,Delphi(Windows环境)等。ORACLE的Pro*C即是使用嵌入式SQL的平台。,北京邮电大学软件学院 郭文明 2003.06,3.1 嵌入式SQL,把SQL嵌入主语言使用时必须解决的三个问题:1区分 SQL语句与主语言语句,用EXEC SQL开始.2数据库工作单元和程序工作单元之间的通信.SQL语句可以使用主语言的程序变量(简称主变量),这些变量名前加冒号(:)作标志,以区别于字段名。
3、这些变量由BEGIN DECLARE SECTION与END DECLARE SECTION语句之间说明.主语言中不能引用数据库中的字段变量.SQL语句执行后,系统要反馈给应用程序若干信息,这些信息送到SQL的通信区SQLCA。SQLCA 用语句EXEC SQL INCLUDE加以定义。3一个SQL语句原则上可产生或处理一组记录,而主语言一次只能处理一个记录,为此必须协调两种处理方式。这是用游标来解决的。,北京邮电大学软件学院 郭文明 2003.06,3.1 嵌入式SQL,主语言+嵌入SQL,预处理,主语言+函数调用,主语言编译器,主语言执行程序,预处理器把嵌入的SQL语句从主程序命令中分离出
4、来,转换成相应的主语言语句.例:1.UNIX环境下,程序员创建包含SQL的main.pc的源程序.2.Oracle程序员调用预编译器:proc iname=main.pc 生成main.c,其中SQL语句被纯c语句(Orcale运行期库函数)替换.3.主语言编译 cc-c main.c,生成main.o目标文件.4.连编生成可执行文件.,嵌入式SQL的执行,北京邮电大学软件学院 郭文明 2003.06,3.1.1 C语言中嵌入式SQL,#include#include“prompt.h”exec sql include sqlca;/*声明通讯区*/char cid_prompt=“请输入顾客
5、号:”;int main()exec sql begin declare section;char cust_id5,cust_name14;float cust_discnt;char user_name20,user_ped20;exec sql end declare section;/*声明变量*/exec sql whenever sqlerror goto report_error;exec sql whenever not found goto notfound;/*出错处理*/strcpy(user_name,”mytest”);strcpy(user_pwd,”test”);
6、exec sql connect:user_name identified by:user_pwd;/*连接*/,while(prompt(cid_prompt,1,cust_id,4)=0)exec sql select cname,discnt into:cust_name,:cust_discnt from customers where cid=:cust_id;exec sql commit work;printf(“顾客名:%s 折扣率:%5.1fn”,cust_name,cust_discnt);continue;notfound:printf(“没找到%s,继续n”,cust_
7、id);/*根据输入的顾客ID查询顾客信息*/exec sql commit release;/*正常释放连接*/return 0;report_error:print_dberror();/*出错信息*/exec sql rollback release;/*释放连接*/return 1;,北京邮电大学软件学院 郭文明 2003.06,3.1.1 C语言中嵌入式SQL,区分SQL语句与C语言语句嵌入的SQL语句以EXEC SQL开始,以分号(;)结束。例:exec sql select came,discnt into:cust_name,:cust_discnt from customer
8、s where cid=:cust_id;嵌入SQL语句与C语言之间的数据传递宿主变量(宿主变量出现于SQL语句中时,前面加(:)以区别列名)C变量既可以用在C语句中,也可用在SQL语句中,用来在两者之间传递数据。,北京邮电大学软件学院 郭文明 2003.06,3.1.1 C语言中嵌入式SQL,宿主变量的声明 在嵌入式SQL语句中使用宿主变量,必须先声明它们:声明为通常的C变量,并将其放在下列标识语句之间,EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION 例:exec sql begin declare section;ch
9、ar cust_id5=c001;char cust_name14;float cust_discnt;exec sql end declare section;,北京邮电大学软件学院 郭文明 2003.06,3.1.1 C语言中嵌入式SQL,在SQL中建立连接和释放连接 在一个嵌入式SQL程序开始,程序面临着和交互式用户同样的问题:怎样与数据库建立连接.例:exec sql begin declare section;/*声明变量*/char user_name10,user_ped10;exec sql end declare section;strcpy(user_name,mytest
10、);/*变量赋值*/strcpy(user_pwd,test);exec sql connect:user_name identified by:user_pwd;/*Oracle连接*/例:exec sql commit release;/*Oracle断开连接*/exec sql rollback release;/*Oracle断开连接*/,北京邮电大学软件学院 郭文明 2003.06,3.1.2 游标,SQL与主语言之间操作方式的协调SQL:一次一集合。C语言:一次一记录。游标:在查询结果的记录集合中移动的指针。若一个SQL语句返回单个元组,则不用游标。若一个SQL语句返回多个元组,则
11、使用游标。不需要游标的数据操作结果是一个元组的select语句 exec sql select came,discnt into:cust_name,:cust_discnt from customers where cid=:cust_id;,北京邮电大学软件学院 郭文明 2003.06,3.1.2 游标,需要游标的数据操作当select语句的结果中包含多个元组时,使用游标可以逐个存取这些元组。活动集:select语句返回的元组的集合。当前行:活动集中当前处理的那一行。游标即是指向当前行的指针。游标分类:滚动游标:游标的位置可以来回移动,可在活动集中取任意元组。非滚动游标:只能在活动集中顺序
12、地取下一个元组。更新游标:数据库对游标指向的当前行加锁,当程序读下一行数据时,本行数据解锁,下一行数据加锁。,北京邮电大学软件学院 郭文明 2003.06,3.1.2 游标,定义一个游标,使之对应一个select语句 DECLARE 游标名 SCROLL CURSOR FOR select语句 for update of列表名for update任选项,表示该游标可用于对当前行的修改与删除。打开一个游标,执行游标对应的查询,结果集合为该游标的活动集。OPEN 游标名 在游标被声明之后,它仍然不是活动状态,在程序开始检索信息之前,执行SQL的OPEN语句打开这个游标,游标被打开之后,可使用取(f
13、etch)操作从游标中每次检索一行,程序完成检索后,应关闭游标,北京邮电大学软件学院 郭文明 2003.06,3.1.2 游标,在活动集中将游标移到特定的行,并取出该行数据放到相应的宿主变量中。FETCH NEXT|PRIOR|FIRST|LAST|CURRENT|RELETIVE n|ABSOLUTE n 游标名 INTO 宿主变量表 关闭游标,释放活动集及其所占资源。需要再使用该游标时,执行open语句。CLOSE 游标名删除游标,以后便不能再对该游标执行open语句了.FREE 游标名,北京邮电大学软件学院 郭文明 2003.06,3.1.2 游标,#define ture 1#incl
14、ude#include“prompt.h”exec sql include sqlca;/*声明通讯区*/int main()char cid_prompt=“请输入顾客号:”;exec sql begin declare section;char cust_id5,agent_id4;double dollar_sum;char user_name20,user_ped20;exec sql end declare section;/*声明变量*/exec sql declare agent_dollars cursor for select aid,sum(dollars)from ord
15、ers where cid=:cust_id group by aid;/*游标*/exec sql whenever sqlerror goto report_error;exec sql whenever not found goto finish;/*出错处理*/strcpy(user_name,”mytest”);strcpy(user_pwd,”test”);,exec sql connect:user_name identified by:user_pwd;/*连接*/while(prompt(cid_prompt,1,cust_id,4)=0)exec sql open agen
16、t_dollars;while(ture)exec sql fetch agent_dillars into:agent_id,:dollar_sum;/*游标取值*/printf(“%s%11.2fn”,agent_id,dollar_sum);continue;finish:exec sql close agent_dollars;exec sql commit work;/*游标关闭*/*输入顾客ID的代理商和金额*/exec sql commit release;/*正常释放连接*/return 0;report_error:print_dberror();/*出错信息*/exec s
17、ql rollback release;/*释放连接*/return 1;,北京邮电大学软件学院 郭文明 2003.06,3.1.3 通讯区,SQL语句执行信息反馈良好的应用程序必须提供对错误的处理,应用程序需要知道SQL语句是否正确执行了,发生错误时的错误代码,执行时遇到特殊情况时的警告信息。SQL通讯区SQLCA是一个已被声明过的内存结构,每一嵌入SQL语句的执行情况在其执行完成后写入USERCA结构中的各变量中,根据SQLCA中的内容可以获得每一嵌入SQL语句执行后的信息,应用程序就可以做相应的处理。为了说明(USERCA),必须在应用程序中包括:EXEC SQL INCLUDE SQL
18、CA;,北京邮电大学软件学院 郭文明 2003.06,3.1.3 通讯区,SQLCODE:SQLCODE是SQLCA的结构一个成员。它是一个每次执行完SQL语句都被更新的整型变量。如果执行成功,SQLCODE为0;如果语句没有产生错误,但遇到了没有数据,SQLCODE为100;除去成功返回0或没有数据返回100的情况,其他都是某种错误并返回一个负数。SQL-99和X/OpenSQL等标准提倡用SQLSTATE取代SQLCODE检测SQL的执行情况,并将SQLSTATE设置为标准,但在产品中还不一定支持。例如ORACLE中,预处理程序运行时必须设置MODE=ANSI才能支持SQLSTATE.,北
19、京邮电大学软件学院 郭文明 2003.06,3.1.3 通讯区,SQLSTATE:SQLSTATE作用与SQLCODE作用相同,但它是在标准方式下起作用。SQLCODE是一个整数,SQLSTATE是一个长度为5的只能由A到Z字符和0到9数字组成的字符串。5个字符分为两组,前两个为类码,后三个为子类码。SQL标准规定:分类码的第一个字符可为A到H或0到4,这样分类主要为了统一,第一个字符为I到Z或5到9的分类码留给软件开发者去定义。分类码00指成功,01指成功但产生一个警告,02指没有数据,等价于SQLCODE的100,非00、01和02指语句没有成功完成。可以查阅数据库系统产品的嵌入式SQL参
20、考指南得到SQLSTATE、SQLCODE、SQLCA,确定主要的出错条件,以它们的报告方式。,北京邮电大学软件学院 郭文明 2003.06,3.1.4 错误处理,Whenever语句使我们在遇到出错和其他情况时,控制程序的运行:EXEC SQL WHENEVER 条件 动作 条件可以是SQLERROR:执行错误,如连接不成功等;NOT FOUND:没有数据,如游标指针到头或到尾等;SQLWARNING:警告错误。动作可以是CONTINUE:继续正常流程;GOTO 标号:转移到标号行继续执行;STOP:结束程序,撤消当前事务,并断开数据库连接;DO 函数:引发一个对已经命名的函数的调用。,北京
21、邮电大学软件学院 郭文明 2003.06,3.1.4 错误处理,没有WHENEVER语句时缺省动作是Continue.如果SQLCODE为负,则SQLERROR为真,如果SQLCODE为100或SQLSTATE为02000,则NOT FOUND为真。抽取错误信息的确切代码依赖于所使用的数据库系统。WHENEVER语句的主要价值在于减少处理错误的代码行数,另外WHENEVER的语法可以在不同数据库系统之间进行最大限度的移植。例如利用检测条件NOT FOUND在不同数据库产品中可能有不同的sqlca.sqlcode值,但NOT FOUND却始终表示没有发现记录这一错误。,北京邮电大学软件学院 郭文
22、明 2003.06,3.1.5 指示变量,如果一个宿主变量所对应的数据库字段允许空值,或字符串类型的宿主变量的长度可能小于所对应的数据库字段的长度,则需要一个指示变量来指明数据库访问的返回状态。指示变量:是一个C变量,用来指示返回给宿主变量的值是否为null值,以及返回给宿主变量的字符串是否发生了截断。指示变量的返回值:=0:取到主变量的值不空,没有发生截断。=1:取到主变量的值为空值。0:取到主变量的值发生了截断,指示变 量的值是截断前的字符串的实际长度。,北京邮电大学软件学院 郭文明 2003.06,3.1.5 指示变量,指示变量的用法:声明与宿主变量的声明方式一样,在数据操纵语句中,在宿
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 设计 开发 软件 学院 研究生 讲义
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6050214.html