数据库系统概论第8章课件

上传人:痛*** 文档编号:241898979 上传时间:2024-08-03 格式:PPT 页数:85 大小:2.88MB
返回 下载 相关 举报
数据库系统概论第8章课件_第1页
第1页 / 共85页
数据库系统概论第8章课件_第2页
第2页 / 共85页
数据库系统概论第8章课件_第3页
第3页 / 共85页
点击查看更多>>
资源描述
第第1111章章 数据库应用开发数据库应用开发业精于勤,荒于嬉;业精于勤,荒于嬉;行成于思,毁于随行成于思,毁于随l韩愈进学解 l学业事业靠勤奋而精进,因嬉游而荒废;行动靠深思熟虑才有成就,因盲从而失败数据库设计回顾01020304综合各个用户的应用需求,需求文档,数据字典、业务流程图需求分析需求分析-基础基础概念模式(信息世界模型),用E-R图来描述。E-R模型的基本概念和图示方法;E-R模型的设计;把E-R模型转换为关系模型的方法概念结构设计概念结构设计-关键关键将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图,形成数据的外模式逻辑结构设计逻辑结构设计根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式物理结构设计物理结构设计05根据逻辑设计和物理设计的结果构建数据库编写与调试应用程序,组织数据入库并进行试运行数据库实施数据库实施06经过试运行后即可投入正式运行在运行过程中必须不断对其进行评估、调整与修改数据库运行和维护数据库运行和维护 第七章第七章 自测试题自测试题1选择题选择题(l)数据库外模式是在下列哪个阶段设计()A.数据库概念结构设计 B.数据库逻辑结构设计C.数据库物理设计 D.数据库实施和维护(2)生成DBMS系统支持的数据模型是在下列哪个阶段完成()A.数据库概念结构设计 B.数据库逻辑结构设计C.数据库物理设计 D.数据库实施和维护(3)根据应用需求建立索引是在下列哪个阶段完成()。A.数据库概念结构设计 B.数据库逻辑结构设计C.数据库物理设计 D.数据库实施和维护(4)员工性别的取值,有的为“男”、“女”,有的为1、0 这种配置情况属于()A.属性冲突 B.命名冲突C.结构冲突 D.数据冗余2.填空题填空题 (1)数据库设计方法包括_、_、_、_、和统一建模语言方法等。(2)数据库设计的基本步骤包括需求分析、数据库设计的基本步骤包括需求分析、_、_、_、数据库实施、数据库运行和维护、数据库实施、数据库运行和维护等。等。(3)集成局部E-R图要分两个步骤,分别是_、和_。(4)数据库常见的存取方法主要有_、_、和Hash方法。3.问答题问答题 (1)在进行概念结构设计时,将事物作为属性的基本准则是什么。(2)将将E-R图转换为关系模式时,实体、联系、属性如何进行转换?图转换为关系模式时,实体、联系、属性如何进行转换?第七章 自测试题答案1.选择题 BBCA2.填空题(1)新奥尔良方法 基于E-R模型的方法 3NF的设计方法 面向对象的设计方法(2)概念结构设计 逻辑结构设计 物理结构设计(3)合并 修改和重构(4)索引 聚簇3.问答题(1)在进行概念结构设计时,将事物作为属性的基本准则是什么答:作为属性,不能再具有需要描述的性质,属性必须是不可分的数据项,不能包含其他属性;属性不能与其他实体具有联系,即E-R图中所表示的联系是实体之间的联系。(2)将E-R图转换为关系模式时,可以如何处理实体型间的联系。答:一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并;一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并;一个m:n可以转化为一个关系模式;3个或3个以上实体间的一个多元联系可以转换为一个关系模式;具有相同码的关系模式可合并。测一测测一测(1)嵌入式SQL语句中为了和主语言语句进行区分,在SQL语句前加前缀_,以_结束。(2)主变量可以附加一个指示变量,指示变量可以表示输入主变量是否为_。(3)SQL是面向集合的,主语言是面向记录的,可以使用_解决这一问题。(4)存储过程经过编译、优化之后存储在_。(5)应用程序中访问和管理数据库的方法有_、_、_、_和OLEDB等。第八章数据库编程8.1 嵌入式SQL8.2 过程化SQL8.3 存储过程和函数8.4 ODBC编程*8.5 OLE DB*8.6 JDBC编程8.7 小结前言数据库应用系统的开发中常常使用编程方法对数据库进行操纵,本章介绍编程技术涉及的概念和使用方法。主要知识点(本章内容实践性强,通过实践培养选择不同方法和技术开发数据库应用程序的能力):了解SQL编程技术可以有效克服SQL实现复杂应用方面的不足,提高应用系统和RDBMS间的互操作性。了解使用ODBC开发应用系统的体系结构。掌握嵌入SQL游标的概念和使用方法;掌握PL/SQL和存储过程的基本概念,基本结构,语句语法和用法。掌握ODBC API和ODBC的应用程序的工作流程。能在实际安装的RDBMS上通过编程的方式开发应用程序,完成对数据库的各种操作。能使用ODBC来进行数据库应用程序的设计,使设计的应用系统可移植性性好,并且能同时访问不同的数据库,共享数据资源。8这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充SQL语言提供了两种不同的使用方式交互式嵌入式SQL语言是非过程性语言事务处理应用需要高级语言(过程性语言:程序在执行过程中,会分成几个过程去执行,不仅需要指出“做什么”(需要什么样的数据),还需要指出“怎么做”(怎样获得这些数据)、面向对象语言等)使用方式为什么要引入嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程v主语言主语言n嵌入式嵌入式SQL是将是将SQL语句嵌语句嵌入程序设计语言中,被嵌入入程序设计语言中,被嵌入的程序设计语言,如的程序设计语言,如C、C+、Java,称为宿主语言,称为宿主语言,简称简称主语言主语言。v处理过程处理过程n预编译方法预编译方法v为了区分为了区分SQL语句与主语言语句,所语句与主语言语句,所有有SQL语句必须加前缀语句必须加前缀EXEC SQL,主语言为主语言为C语言时,语句格式:语言时,语句格式:nEXEC SQL;关系数据库管理系统预处关系数据库管理系统预处理程序转换嵌入式理程序转换嵌入式SQL语语句为函数调用句为函数调用含嵌入式含嵌入式SQL语句语句的主语言程序的主语言程序转换后的转换后的主语言程序主语言程序主语言编译程序主语言编译程序编译处理编译处理目标语言程序目标语言程序8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句pSQL语句 描述性的面向集合集合的语句 负责操纵数据库p高级语言语句 过程性的面向记录记录的语句 负责控制逻辑流程它们之间应该如何通信?它们之间应该如何通信?数据库工作单元与源程序工作单元之间的通信(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现(2)主语言向SQL语句提供参数,主要用主变量实现(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现关于SQLCA010203SQLCA:SQL Communication Area是一个数据结构SQLCA的用途uSQL语句执行后,系统反馈给应用程序信息,描述系统当前工作状态,描述运行环境u这些信息将送到SQL通信区中u应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句SQLCA使用方法定义SQLCA:用EXEC SQL INCLUDE SQLCA定义使用SQLCASQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错应用程序每执行完一条SQL 语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理主变量嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据在SQL语句中使用的主语言程序变量简称为主变量(Host Variable)主变量类型输入主变量:由应用程序对其赋值,SQL语句引用输出主变量:由SQL语句对其赋值或设置状态信息,返回给应用程序指示变量指示变量是一个整型变量,用来“指示”所指主变量的值或条件一个主变量可以附带一个指示变量(Indicator Variable)指示变量的用途:指示输入主变量是否为空值,检测输出变量是否为空值,值是否被截断在SQL语句中使用主变量和指示变量的方法说明主变量和指示变量BEGIN DECLARE SECTION.(说明主变量和指示变量).END DECLARE SECTION说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中语句中的主变量名前要加冒号(冒号(:)作为标志使用主变量可以直接引用,不必加冒号在SQL语句之外(主语言语句中)使用主变量和指示变量的方法p指示变量前也必须加冒号标志p 必须紧跟在所指主变量主变量之后使用指示变量在在SQL语句中使用主变量和指示变量的方法语句中使用主变量和指示变量的方法为什么要使用游标为什么要使用游标关于游标关于游标SQL语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录主语言是面向记录的,一组主变量一次只能存放一条记录仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理(1)建立)建立和关闭数和关闭数据库连接据库连接 EXEC SQL CONNECT TO targetAS connection-nameUSER user-name;target是要连接的数据库服务器常见的服务器标识串,如:包含服务器标识的SQL串常量 DEFAULT connect-name是可选的连接名,连接名必须是一个有效的标识符,在整个程序内只有一个连接时可以不指定连接名程序运行过程中可以修改当前连接 EXEC SQL SET CONNECTION connection-name|DEFAULT;(2)关闭数据库连接 EXEC SQL DISCONNECT connection;v例例8.1 依次检查某个系的学生记录,交互式更新某些学依次检查某个系的学生记录,交互式更新某些学生年龄。生年龄。EXEC SQL BEGIN DECLARE SECTION;/*主变量说明开始主变量说明开始*/char Deptname20;char Hsno9;char Hsname20;char Hssex2;int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION;/*主变量说明结束主变量说明结束*/long SQLCODE;EXEC SQL INCLUDE SQLCA;/*定义定义SQL通信区通信区*/程序实例(续)程序实例(续)int main(void)/*C语言主程序开始语言主程序开始*/int count=0;char yn;/*变量变量yn代表代表yes或或no*/printf(Please choose the department name(CS/MA/IS):);scanf(%s,deptname);/*为主变量为主变量deptname赋值赋值*/EXEC SQL CONNECT TO TESTlocalhost:54321 USER SYSTEM/MANAGER;/*连接数据库连接数据库TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定义游标定义游标SX*/SELECT Sno,Sname,Ssex,Sage /*SX对应的语句对应的语句*/FROM StudentWHERE SDept=:deptname;EXEC SQL OPEN SX;/*打开游标打开游标SX,指向查询结果的第一行,指向查询结果的第一行*/程序实例(续)程序实例(续)for(;)/*用循环结构逐条处理结果集中的记录用循环结构逐条处理结果集中的记录*/EXEC SQL FETCH SX INTO:HSno,:Hsname,:HSsex,:HSage;/*推进游标,将当前数据放入主变量推进游标,将当前数据放入主变量*/if(SQLCA.SQLCODE!=0)/*SQLCODE!=0,表示操作不成功,表示操作不成功*/break;/*利用利用SQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环*/if(count+=0)/*如果是第一行的话,先打出行头如果是第一行的话,先打出行头*/printf(n%-10s%-20s%-10s%-10sn,Sno“,Sname“,Ssex,Sage);printf(%-10s%-20s%-10s%-10dn“,HSno,Hsname,Hssex,HSage);/*打印查询结果打印查询结果*/printf(“UPDATE AGE(y/n)?”);/*询问用户是否要更新该学生的年龄询问用户是否要更新该学生的年龄*/doscanf(%c,&yn);while(yn!=N&yn!=n&yn!=Y&yn!=y);程序实例(续)程序实例(续)if(yn=y|yn=Y)/*如果选择更新操作如果选择更新操作*/printf(INPUT NEW AGE:);scanf(%d,&NEWAGE);/*用户输入新年龄到主变量中用户输入新年龄到主变量中*/EXEC SQL UPDATE Student /*嵌入式嵌入式SQL更新语句更新语句*/SET Sage=:NEWAGE WHERE CURRENT OF SX;/*对当前游标指向的学生年龄进行更新对当前游标指向的学生年龄进行更新*/EXEC SQL CLOSE SX;/*关闭游标关闭游标SX,不再和查询结果对应,不再和查询结果对应*/EXEC SQL COMMIT WORK;/*提交更新提交更新*/EXEC SQL DISCONNECT TEST;/*断开数据库连接断开数据库连接*/8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL不用游标的SQL语句的种类说明性语句说明性语句:数据定义语句数据定义语句数据控制语句数据控制语句查询结果为单记录的查询结果为单记录的SELECT语句语句非非CURRENT形式的增删改语句形式的增删改语句 这类语句不需要使用游标,只需用INTO子句指定存放查询结果的主变量。例8.2 根据学生号码查询学生信息。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno;/*把要查询的学生的学号赋给了主变量givensno*/INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使用主变量查询返回的记录中,可能某些列为空值NULL 如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,关系数据库管理系统会在SQLCA中返回错误信息 查询结果为单记录的查询结果为单记录的SELECT语句(续)语句(续)v例例8.3 查询某个学生选修某门课程的成绩。假设已经把将要查询的学查询某个学生选修某门课程的成绩。假设已经把将要查询的学生的学号赋给了主变量生的学号赋给了主变量givensno,将课程号赋给了主变量,将课程号赋给了主变量givencno。EXEC SQL SELECT Sno,Cno,Grade INTO:Hsno,:Hcno,:Hgrade:Gradeid /*指示变量指示变量Gradeid*/FROM SC WHERE Sno=:givensno AND Cno=:givencno;如果如果Gradeid 0,不论,不论Hgrade为何值,均认为该学生成绩为空值。为何值,均认为该学生成绩为空值。v(查询结果为空值,系统会自动将相应主变量后的指示变量设为负值,(查询结果为空值,系统会自动将相应主变量后的指示变量设为负值,而不再向该主变量赋值。)而不再向该主变量赋值。)v在在UPDATE的的SET子句和子句和WHERE子句中可以使用主变量,子句中可以使用主变量,SET子句子句还可以使用指示变量还可以使用指示变量 v例例8.4 修改某个学生选修修改某个学生选修1号课程的成绩。号课程的成绩。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量:修改的成绩已赋给主变量:newgrade*/WHERE Sno=:givensno;/*学号赋给主变量:学号赋给主变量:givensno*/非非CURRENT形式的增删改语句(续)形式的增删改语句(续)v例例8.5 某个学生新选修了某门课程,将有关记录某个学生新选修了某门课程,将有关记录插入插入SC表中。假设插入的学号已赋给主变量表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量,课程号已赋给主变量couno。gradeid=-1;/*gradeid为指示变量,赋为负值为指示变量,赋为负值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);/*:stdno,:couno,:gr为主变量为主变量*/由于该学生刚选修课程,成绩应为空,所以要把指示变量由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值赋为负值8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.4 使用游标的使用游标的SQL语句语句v必须使用游标的必须使用游标的SQL语句语句n查询结果为多条记录的查询结果为多条记录的SELECT语句语句nCURRENT形式的形式的UPDATE语句语句nCURRENT形式的形式的DELETE语句语句v使用游标的步骤使用游标的步骤(1)说明游标)说明游标(2)打开游标)打开游标(3)推进游标指针并取当前记录)推进游标指针并取当前记录(4)关闭游标)关闭游标使用游标的步骤使用游标的步骤声明游标声明游标打开游标打开游标读取游标读取游标v使用使用DECLARE语句格语句格式式EXEC SQL DECLARE CURSOR FOR;v功能功能n是一条说明性语句,这是一条说明性语句,这时关系数据库管理系统时关系数据库管理系统并不执行并不执行SELECT语句语句v使用使用OPEN语句格式语句格式v EXEC SQL OPEN;v功能功能n打开游标实际上是执行相打开游标实际上是执行相应的应的SELECT语句,把查询语句,把查询结果取到缓冲区中结果取到缓冲区中n这时游标处于活动状态,这时游标处于活动状态,指针指向查询结果集中的第指针指向查询结果集中的第一条记录一条记录v使用使用FETCH语句格式语句格式 EXEC SQL FETCH INTO ,.;v功能:功能:指定方向推动游标指定方向推动游标指针,同时将缓冲区中的当指针,同时将缓冲区中的当前记录取出来送至主变量供前记录取出来送至主变量供主语言进一步处理主语言进一步处理使用使用CLOSE语句格式语句格式 EXEC SQL CLOSE;v功能:功能:关闭游标,释关闭游标,释放结果集占用的缓冲区放结果集占用的缓冲区及其他资源及其他资源v说明:说明:n游标被关闭后,就游标被关闭后,就不再和原来的查询结不再和原来的查询结果集相联系果集相联系n被关闭的游标可以被关闭的游标可以再次被打开,与新的再次被打开,与新的查询结果相联系查询结果相联系关闭游标关闭游标CURRENT形式的形式的UPDATE语句和语句和DELETE语句的用途语句的用途非CURRENT形式的UPDATE语句和DELETE语句u面向集合的操作u一次修改或删除所有满足条件的记录不能使用不能使用CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句当游标定义中的SELECT语句带有UNION或ORDER BY子句 该SELECT语句相当于定义了一个不可更新的视图 如果只想修改或删除其中如果只想修改或删除其中某个某个记录记录用带游标的SELECT语句查出所有满足条件的记录从中进一步找出要修改或删除的记录用CURRENT形式的UPDATE语句和DELETE语句修改或删除之UPDATE语句和DELETE语句中要用子句WHERE CURRENT OF 表示修改或删除的是最近一次取出的记录,即游标指针指向的记录 8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL 8.1.5 动态动态SQLv静态嵌入式静态嵌入式SQLn静态嵌入式静态嵌入式SQL语句能够满足一般要求语句能够满足一般要求 n无法满足要到执行时才能够确定要提交的无法满足要到执行时才能够确定要提交的SQL语句、语句、查询的条件查询的条件 v动态嵌入式动态嵌入式SQLn允许在程序运行过程中临时允许在程序运行过程中临时“组装组装”SQL语句语句n支持动态组装支持动态组装SQL语句和动态参数两种形式语句和动态参数两种形式 1.使用使用SQL语句主变量语句主变量1 SQL语句主变量语句主变量n程序主变量包含的内容是程序主变量包含的内容是SQL语句的内容,而不是原来保存数据语句的内容,而不是原来保存数据的输入或输出变量的输入或输出变量nSQL语句主变量在程序执行期间可以设定不同的语句主变量在程序执行期间可以设定不同的SQL语句,然后语句,然后立即执行立即执行 v例例8.7 创建基本表创建基本表TEST。EXEC SQL BEGIN DECLARE SECTION;const char*stmt=CREATE TABLE test(a int);/*SQL语句主变量,内容是创建表的语句主变量,内容是创建表的SQL语句语句*/EXEC SQL END DECLARE SECTION;.EXEC SQL EXECUTE IMMEDIATE:stmt;/*执行动态执行动态SQL语句语句*/2.动态参数动态参数2 动态参数动态参数nSQL语句中的可变元素语句中的可变元素n使用参数符号使用参数符号(?)表示该位置的数据在运行时设定)表示该位置的数据在运行时设定v和主变量的区别和主变量的区别n动态参数的输入不是编译时完成绑定,而是通过动态参数的输入不是编译时完成绑定,而是通过 PREPARE语句准备主语句准备主变量和执行语句变量和执行语句EXECUTE绑定数据或主变量来完成绑定数据或主变量来完成 v使用动态参数的步骤使用动态参数的步骤(1)声明)声明SQL语句主变量语句主变量(2)准备)准备SQL语句(语句(PREPARE)EXEC SQL PREPARE FROM;3 执行准备好的语句执行准备好的语句准备好的语句准备好的语句(EXECUTE)()(续)续)v例例8.8 向向TEST中插入元组。中插入元组。EXEC SQL BEGIN DECLARE SECTION;const char*stmt=INSERT INTO test VALUES(?);/*声明声明SQL主变量内容是主变量内容是INSERT语句语句*/EXEC SQL END DECLARE SECTION;.EXEC SQL PREPARE mystmt FROM:stmt;/*准备语句准备语句*/.EXEC SQL EXECUTE mystmt USING 100;/*执行语句,设定执行语句,设定INSERT语句插入值语句插入值100*/EXEC SQL EXECUTE mystmt USING 200;/*执行语句,设定执行语句,设定INSERT语句插入值语句插入值200*/EXECUTE将SQL语句中分析出的动态参数和主变量或数据常量绑定,作为语句的输入或输出变量。EXEC SQL EXECUTE INTO USING;第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结8.2 过程化过程化SQL8.2.1 过程化过程化SQL的块结构的块结构8.2.2 变量和常量的定义变量和常量的定义8.2.3 流程控制流程控制8.2.1 过程化过程化SQL的块结构的块结构v过程化过程化SQL nSQL的扩展的扩展;增加了增加了过程化过程化语句功能语句功能;基本结构是块基本结构是块;块之间可以互相嵌套块之间可以互相嵌套;每个块完每个块完成一个逻辑操作成一个逻辑操作v过程化过程化SQL块的基本结构块的基本结构1.定义部分定义部分 DECLARE 变量、常量、游标、异常等变量、常量、游标、异常等 l定义的变量、常量等只能在该基本块中使用定义的变量、常量等只能在该基本块中使用l当基本块执行结束时,定义就不再存在当基本块执行结束时,定义就不再存在2.执行部分执行部分 BEGIN SQL语句、过程化语句、过程化SQL的流程控制语句的流程控制语句 EXCEPTION 异常处理部分异常处理部分 END;l 8.2.2 变量和常量的定义变量和常量的定义1.变量定义变量定义n变量名变量名 数据类型数据类型 NOT NULL:=初值表达式初值表达式或或n变量名变量名 数据类型数据类型 NOT NULL 初值表达式初值表达式2.常量定义常量定义n常量名常量名 数据类型数据类型 CONSTANT:=常量表达式常量表达式n常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,过程化如果试图修改它,过程化SQL将返回一个异常将返回一个异常3.赋值语句赋值语句n变量名称变量名称:=表达式表达式8.2.3 流程控制流程控制v过程化过程化SQL功能功能1.条件控制语句条件控制语句2.循环控制语句循环控制语句 3.错误处理错误处理 流程控制(续)流程控制(续)1.条件控制语句条件控制语句 IF-THEN,IF-THEN-ELSE和嵌套的和嵌套的IF语句语句(1)IF condition THEN Sequence_of_statements;END IF;(2)IF condition THEN Sequence_of_statements1;ELSE Sequence_of_statements2;END IF;(3)在)在THEN和和ELSE子句中还可以再包含子句中还可以再包含IF语句,即语句,即IF语句可以嵌套语句可以嵌套 流程控制(续)流程控制(续)2.循环控制语句循环控制语句 LOOP,WHILE-LOOP和和FOR-LOOP(1)简单的循环语句简单的循环语句LOOP LOOP Sequence_of_statements;END LOOP;多数数据库服务器的过程化多数数据库服务器的过程化SQL都提供都提供EXIT、BREAK或或 LEAVE等循环结束语句,等循环结束语句,保证保证LOOP语句块能够结束语句块能够结束(2)WHILE-LOOP WHILE condition LOOP Sequence_of_statements;END LOOP;l每次执行循环体语句之前,首先对条件进行求值,如果条件为真,则执行循每次执行循环体语句之前,首先对条件进行求值,如果条件为真,则执行循环体内的语句序列,如果条件为假,则跳过循环并把控制传递给下一个语句环体内的语句序列,如果条件为假,则跳过循环并把控制传递给下一个语句(3)FOR-LOOP FOR count IN REVERSE bound1 bound2 LOOP Sequence_of_statements;END LOOP;流程控制(续)流程控制(续)3.错误处理错误处理n如果过程化如果过程化SQL在执行时出现异常,则应该让程序在在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异产生异常的语句处停下来,根据异常的类型去执行异常处理语句常处理语句 nSQL标准对数据库服务器提供什么样的异常处理做出标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化了建议,要求过程化SQL管理器提供完善的异常处理管理器提供完善的异常处理机制机制 第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结8.3 存储过程和函数存储过程和函数8.3.1 存储过程存储过程8.3.2 函数函数*8.3.3 过程化过程化SQL中的游标中的游标8.3.1 存储过程存储过程v过程化过程化SQL块类型块类型n命名块命名块l编译后保存在数据库中,可以被反复调用,运行速度较快,过程和函数是命名块编译后保存在数据库中,可以被反复调用,运行速度较快,过程和函数是命名块 n匿名块匿名块l每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调块中调用用 v存储过程:由过程化存储过程:由过程化SQL语句书写的过程,经编译和优化后存储在数据库服务器中,语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。使用时只要调用即可。v存储过程的优点存储过程的优点(1)运行效率高)运行效率高(2)降低了客户机和服务器之间的通信量)降低了客户机和服务器之间的通信量(3)方便实施企业规则)方便实施企业规则 (4)特别适合统计和查询操作特别适合统计和查询操作l一般统计和查询,尤其是期末统计,往往涉及数据量大、表多,若在一般统计和查询,尤其是期末统计,往往涉及数据量大、表多,若在客户端客户端实现,实现,数据流量和网络通信数据流量和网络通信量较大量较大;l很多情况下,管理信息系统的设计者,将复杂的查询和统计用很多情况下,管理信息系统的设计者,将复杂的查询和统计用存储过程存储过程来实现,来实现,免去免去客户端客户端的大量编程的大量编程。存储过程(续)存储过程(续)v存储过程的用户接口存储过程的用户接口用户通过下面的用户通过下面的SQL语句创建、语句创建、执行、修改和删除存储过程。执行、修改和删除存储过程。(1)创建存储过程创建存储过程(2)执行存储过程执行存储过程(3)修改存储过程)修改存储过程(4)删除存储过程删除存储过程 2.存储过程的用户接口存储过程的用户接口(1)创建存储过程)创建存储过程CREATE OR REPLACE PROCEDURE 过程名过程名(参数参数1,参数参数2,.)AS;n过程名:数据库服务器合法的对象标识过程名:数据库服务器合法的对象标识n参数列表:用名字来标识调用时给出的参数值,必须参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出指定值的数据类型。参数也可以定义输入参数、输出参数或输入参数或输入/输出参数,默认为输入参数输出参数,默认为输入参数n过程体:是一个过程体:是一个,包括声明部分和可,包括声明部分和可执行语句部分执行语句部分 存储过程的用户接口(续)存储过程的用户接口(续)v例例8.8 利用存储过程来实现下面的应用:从账户利用存储过程来实现下面的应用:从账户1转指定数额的款项到账户转指定数额的款项到账户2中,中,账户关系表账户关系表account(accountnum,total)CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount INT,amount FLOAT)/*定义存储过程定义存储过程TRANSFER,其参数为转入账户、转出账户、转账额度,其参数为转入账户、转出账户、转账额度*/AS DECLARE/*定义变量定义变量*/totalDepositOut Float;totalDepositIn Float;(?未使用未使用)inAccountnum INT;BEGIN /*检查转出账户的余额检查转出账户的余额*/SELECT Total INTO totalDepositOut FROM Accout WHERE accountnum=outAccount;IF totalDepositOut IS NULL THEN /*如果转出账户不存在或账户中没有存款如果转出账户不存在或账户中没有存款*/ROLLBACK;/*回滚事务回滚事务*/RETURN;END IF;存储过程的用户接口(续)存储过程的用户接口(续)IF totalDeposit Out amount THEN /*如果账户存款不足如果账户存款不足*/ROLLBACK;/*回滚事务回滚事务*/RETURN;END IF;SELECT accountnum INTO inAccountnum FROM AccountWHERE accountnum=inAccount;IF inAccount IS NULL THEN /*如果转入账户不存在如果转入账户不存在*/ROLLBACK;/*回滚事务回滚事务*/RETURN;ENDIF;UPDATE Account SET total=total-amount WHERE accountnum=outAccount;/*修改转出账户余额,减去转出额修改转出账户余额,减去转出额*/UPDATE Account SET total=total+amount WHERE accountnum=inAccount;/*修改转入账户余额,增加转入额修改转入账户余额,增加转入额*/COMMIT;/*提交转账事务提交转账事务*/END;存储过程的用户接口(续)存储过程的用户接口(续)(2)执行存储过程)执行存储过程 CALL/PERFORM PROCEDURE 过程名过程名(参数参数1,参数参数2,.);n使用使用CALL或者或者PERFORM等方式激活存储过程的执行等方式激活存储过程的执行n在过程化在过程化SQL中,数据库服务器支持在过程体中调用其他存中,数据库服务器支持在过程体中调用其他存储过程储过程v例例8.9 从账户从账户01003815868转转10000元到元到01003813828账户中。账户中。CALL PROCEDURE TRANSFER(01003813828,01003815868,10000);存储过程的用户接口(续)存储过程的用户接口(续)(3)修改存储过程)修改存储过程 ALTER PROCEDURE 过程名过程名1 RENAME TO 过程名过程名2;(4)删除存储过程删除存储过程 DROP PROCEDURE 过程名过程名();8.3 存储过程和函数存储过程和函数8.3.1 存储过程存储过程8.3.2 函数函数v函数和存储过程的异同函数和存储过程的异同n同:都是持久性存储模块同:都是持久性存储模块n异:函数必须指定返回的类型异:函数必须指定返回的类型*8.3.3 过程化过程化SQL中的游标中的游标函数(续)函数(续)1.函数的定义语句格式函数的定义语句格式CREATE OR REPLACE FUNCTION 函数名函数名(参数参数1,参数参数2,)RETURNS AS;2.函数的执行语句格式函数的执行语句格式CALL/SELECT 函数名函数名(参数参数1,参数参数2,);3.修改函数修改函数n重命名重命名ALTER FUNCTION 过程名过程名1 RENAME TO 过程名过程名2;n重新编译重新编译ALTER FUNCTION 过程名过程名 COMPILE;第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程nODBC优点优点l移植性好移植性好l能同时访问不同的数据库能同时访问不同的数据库l共享多个数据资源共享多个数据资源 *8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程ODBC概述(续)概述(续)vODBC产生的原因产生的原因n由于不同的数据库管理系统的存在,在某个关系数据库管理系统下编写的由于不同的数据库管理系统的存在,在某个关系数据库管理系统下编写的应用程序就不能在另一个关系数据库管理系统下运行应用程序就不能在另一个关系数据库管理系统下运行 n许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理系统系统vODBCn是微软公司开放服务体系(是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中有关数据库的一个组成部分)中有关数据库的一个组成部分 n提供了一组提供了一组访问数据库的应用程序编程接口访问数据库的应用程序编程接口(Application Programming Interface,API)vODBC约束力约束力n规范应用开发规范应用开发n规范关系数据库管理系统应用接口规范关系数据库管理系统应用接口ODBC工作原理概述(续)工作原理概述(续)数据源数据源KingbaseES数据源数据源Oracle数据源数据源SQL Server用户应用程序用户应用程序ODBC应用程序编程接口应用程序编程接口ODBC驱动程序管理器驱动程序管理器数据库数据库驱动程序驱动程序2数据库数据库驱动程序驱动程序1数据库数据库驱动程序驱动程序3网络网络图图8.3 ODBC应用系统的体系结构应用系统的体系结构vODBC应用系统的体系结构应用系统的体系结构 1.用户应用程序用户应用程序 2.ODBC驱动程序管理器驱动程序管理器 3.数据库驱动程序数据库驱动程序4.数据源数据源vODBC应用程序包括的内容应用程序包括的内容n请求连接数据库请求连接数据库n向数据源发送向数据源发送SQL语句语句n为为SQL语句执行结果分配存储空间,定义所读取的数据格式语句执行结果分配存储空间,定义所读取的数据格式n获取数据库操作结果或处理错误获取数据库操作结果或处理错误n进行数据处理并向用户提交处理结果进行数据处理并向用户提交处理结果n请求事务的提交和回滚操作请求事务的提交和回滚操作n断开与数据源的连接断开与数据源的连接2.ODBC驱动程序管理器驱动程序管理器 v驱动程序管理器:用来管理各种驱动程序驱动程序管理器:用来管理各种驱动程序 n包含在包含在ODBC32.DLL中中 n管理应用程序和驱动程序之间的通信管理应用程序和驱动程序之间的通信 n建立、配置或删除数据源,并查看系统当前所安装的数据库建立、配置或删除数据源,并查看系统当前所安装的数据库ODBC驱动程驱动程序序v主要功能:主要功能:l装载装载ODBC驱动程序驱动程序l选择和连接正确的驱动程序选择和连接正确的驱动程序l管理数据源管理数据源l检查检查ODBC调用参数的合法性调用参数的合法性l记录记录ODBC函数的调用等函数的调用等vODBC通过驱动程序来提供应用系统与数据库平台的独立性通过驱动程序来提供应用系统与数据库平台的独立性 vODBC应用程序不能直接存取数据库应用程序不能直接存取数据库n其各种操作请求由驱动程序管理器提交给某个关系数据库管理系统的其各种操作请求由驱动程序管理器提交给某个关系数据库管理系统的ODBC驱动程驱动程序序n通过调用驱动程序所支持的函数来存取数据库通过调用驱动程序所支持的函数来存取数据库n数据库的操作结果也通过驱动程序返回给应用程序数据库的操作结果也通过驱动程序返回给应用程序n如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上vODBC驱动程序类型驱动程序类型n单束单束l数据源和应用程序在同一台机器上数据源和应用程序在同一台机器上l驱动程序直接完成对数据文件的驱动程序直接完成对数据文件的I/O操作操作l驱动程序相当于数据管理器驱动程序相当于数据管理器 n多束多束 l支持客户机支持客户机服务器、客户机服务器、客户机应用服务器应用服务器/数据库服务器等网络环境下的数据访问数据库服务器等网络环境下的数据访问l由驱动程序完成数据库访问请求的提交和结果集接收由驱动程序完成数据库访问请求的提交和结果集接收l应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据 ODBC数据源管理数据源管理(续)(续)v数据源:是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息,是数据源:是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息,是一种数据连接的抽象一种数据连接的抽象v数据源对最终用户是透明的数据源对最终用户是透明的 nODBC给每个被访问的数据源指定唯一的数据源名(给每个被访问的数据源指定唯一的数据源名(Data Source Name,简称,简称DSN),),并映射到所有必要的、用来存取数据的低层软件并映射到所有必要的、用来存取数据的低层软件n在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等n最终用户无须知道数据库管理系统或其他数据管理软件、网络以及有关最终用户无须知道数据库管理系统或其他数据管理软件、网络以及有关ODBC驱动程序的驱动程序的细节细节v例如,假设某个学校在例如,假设某个学校在SQL Server和和KingbaseES上创建了两个数据库:学校人上创建了两个数据库:学校人事数据库和教学科研数据库。事数据库和教学科研数据库。n学校的信息系统要从这两个数据库中存取数据学校的信息系统要从这两个数据库中存取数据n为了方便地与两个数据库连接,为学校人事数据库创建一个数据源名为了方便地与两个数据库连接,为学校人事数据库创建一个数据源名PERSON,为教学,为教学科研数据库创建一个名为科研数据库创建一个名为EDU的数据源的数据源n当要访问每一个数据库时,只要与当要访问每一个数据库时,只要与PERSON和和EDU连接即可,不需要记住使用的驱动程连接即可,不需要记住使用的驱动程序、服务器名称、数据库名序、服务器名称、数据库名 8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程8.4.3 ODBC API 基础基础vODBC 应用程序编程接口的一致性应用程序编程接口的一致性 nAPI一致性一致性l包含核心级、扩展包含核心级、扩展1级、扩展级、扩展2级级n语法一致性语法一致性l包含最低限度包含最低限度SQL语法级、核心语法级、核心SQL语法级、扩展语法级、扩展SQL语法级语法级 1.函数概述函数概述 2.句柄及其属性句柄及其属性3.数据类型数据类型 ODBC不同版本上的函数和函数使用是有差异的,读者必须注意使用的不同版本上的函数和函数使用是有差异的,读者必须注意使用的版本,目前最新的版本是版本,目前最新的版本是ODBC 3.81.函数概述函数概述vODBC 3.0 标准提供了标准提供了76个函数接口个函数接口n分配和释放环境句柄、连接句柄、语句句柄分配和释放环境句柄、连接句柄、语句句柄n连接函数(连接函数(SQLDriverconnect等)等)n与信息相关的函数(与信息相关的函数(SQLGetinfo、SQLGetFuction等)等)n事务处理函数(如事务处理函数(如SQLEndTran)n执行相关函数(执行相关函数(SQLExecdirect、SQLExecute等)等)n编目函数,编目函数,ODBC 3.0提供了提供了11个编目函数,如个编目函数,如SQLTables、SQLColumn等。应用程序可以通过对编目函数的调用来获取数据字典的信息,如权限、等。应用程序可以通过对编目函数的调用来获取数据字典的信息,如权限、表结构等表结构等 v句柄是句柄是32位整数值,代表一个指针位整数值,代表一个指针 vODBC 3.0中句柄分类中句柄分类n环境句柄环境句柄n连接句柄连接句柄n语句句柄语句句柄n描述符句柄描述符句柄 ODBC应用程序应用程序环境句柄环境句柄连接句柄连接句柄语句句柄语句句柄数据源数据源描述符句柄描述符句柄111n1n111n图图8.4 应用程序句柄之间的关系应用程序句柄之间的关系v应用程序句柄之间的关系应用程序句柄之间的关系n每个每个ODBC应用程序需要建立一个应用程序需要建立一个ODBC环境,分配一个环境句柄,环境,分配一个环境句柄,存取数据的全局性背景,如环境状存取数据的全局性背景,如环境状态、当前环境状态诊断、当前在环态、当前环境状态诊断、当前在环境上分配的连接句柄等境上分配的连接句柄等n一个环境句柄可以建立多个连接句一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数柄,每一个连接句柄实现与一个数据源之间的连接据源之间的连接n在一个连接中可以建立多个语句句在一个连接中可以建立多个语句句柄,它不只是一个柄,它不只是一个SQL语句,还包语句,还包括括SQL语句产生的结果集以及相关语句产生的结果集以及相关的信息等的信息等n在在ODBC 3.0中又提出了描述符句中又提出了描述符句柄的概念,它是描述柄的概念,它是描述SQL语句的参语句的参数、结果集列的元数据集合数、结果集列的元数据集合 数据类型(续)数据类型(续)vODBC数据类型数据类型nSQL数据类型:用于数据源数据类型:用于数据源 nC数据类型数据类型:用于应用程序的:用于应用程序的C代码代码 v应用程序应用程序可以通过可以通过SQLGetTypeInfo来获取不同的驱动程序对于数据类型来获取不同的驱动程序对于数据类型的支持情况的支持情况 vSQL数据类型和数据类型和C数据类型之间的转换规则数据类型之间的转换规则SQL数据类型数据类型C数据类型数据类型SQL数据类型数据类型数据源之间转换数据源之间转换应用程序变量传送到语句应用程序变量传送到语句参数(参数(SQLBindparameter)C数据类型数据类型从结果集列中返回到应用从结果集列中返回到应用程序变量(程序变量(SQLBindcol)应用程序变量之间转换应用程序变量之间转换8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程8.4.4 ODBC的工作流程的工作流程vODBC的工作流程的工作流程ODBC的工作流程(续)的工作流程(续)v例例8.11 将将KingbaseES数据库中数据库中Student表的数据备份到表的数据备份到SQL Server数据库中。数据库中。n该应用涉及两个不同的关系数据库管理系统中的数据源该应用涉及两个不同的关系数据库管理系统中的数据源n使用使用ODBC来开发应用程序,只要改变应用程序中连接函数来开发应
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!