1、数据库系统概论,数据库系统概论 An Introduction to Database System第八章 数据库编程,数据库系统概论,第八章 数据库编程,8.1 嵌入式SQL 8.2 存储过程 8.3 ODBC编程,数据库系统概论,8.1 嵌入式SQL,SQL语言提供了两种不同的使用方式: 交互式 嵌入式 为什么要引入嵌入式SQL SQL语言是非过程性语言 事务处理应用需要高级语言 这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充(ESQL),例如,将学生成绩从百分制改为等级制: 90-100为A, 80-89为B 70-79为C, 60-69为D 0-59为E,数据
2、库系统概论,嵌入式SQL的处理过程,嵌入式SQL 是将SQL语句嵌入程序设计语言中 主语言 被嵌入的程序设计语言,如C、C+、Java,称为宿主语言,简称主语言。 处理过程 预编译方法,数据库系统概论,嵌入式SQL的处理过程(续),数据库系统概论,嵌入式SQL小结,什么是嵌入式SQL 为什么要引入嵌入式SQL 处理过程,数据库系统概论,8.2 存储过程,SQL-invoked routines(SQL99): 存储过程(SQL-invoked procedure) 函数(SQL-invoked function) PL/SQL:是编写存储过程的一种过程语言 SQL的扩展 增加了过程化语句功能
3、基本结构是块 块之间可以互相嵌套 每个块完成一个逻辑操作,数据库系统概论,一、PL/SQL的块结构,PL/SQL块的基本结构: 1.定义部分DECLARE -变量、常量、游标、异常等 定义的变量、常量等只能在该基本块中使用 当基本块执行结束时,定义就不再存在,数据库系统概论,PL/SQL的块结构(续),PL/SOL块的基本结构(续):2.执行部分BEGIN-SQL语句、PL/SQL的流程控制语句EXCEPTION-异常处理部分 END;,数据库系统概论,二、控制结构,PL/SQL 流程控制: 条件控制语句 循环控制语句 错误处理,数据库系统概论,控制结构(续),条件控制语句IF-THEN,IF
4、-THEN-ELSE和嵌套的IF语句 循环控制语句LOOP,WHILE-LOOP和FOR-LOOP 错误处理: 如果PL/SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句 SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求PL/SQL管理器提供完善的异常处理机制,数据库系统概论,PL/SQL 流程控制示例:,在SQLServer2005中新建查询,执行下面的程序段 declare i int select i=1 while i=5beginprint 第+cast(i as varchar(1)+次循环select i=i+1end,数
5、据库系统概论,三、存储过程,存储过程:由PL/SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。 存储过程的优点:1. 运行效率高2. 降低了客户机和服务器之间的通信量 3. 方便实施企业规则,数据库系统概论,存储过程的用户接口:1. 创建存储过程 2. 执行存储过程 3. 删除存储过程,数据库系统概论,CREATE Procedure 过程名(参数1,参数2,.) AS; 过程名:数据库服务器合法的对象标识 参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。 过程体:是一个。包括声明部
6、分和可执行语句部分,1. 创建存储过程:,数据库系统概论,例1在SQLServer2005中创建存储过程,统计某门课程的平均成绩,新建查询,执行下面的命令。CREATE PROCEDURE dbo.avggrade cno varchar(20) ASdeclare counter int declare myavg floatselect counter=count(*)from scwhere cno=cno if (counter=0)print cno+-+没有该课程的选课记录!elsebeginselect myavg=avg(grade)from scwhere cno=cnopr
7、int cno+-+(cast(myavg as varchar(20)end,数据库系统概论,CALL/PERFORM/EXEC Procedure 过程名(参数1,参数2,.); 在PL/SQL中,数据库服务器支持在过程体中调用其他存储过程,2. 执行存储过程:,数据库系统概论,例如:新建查询,调用存储过程avggrade,计算2号课程的平均成绩exec avggrade 2,例如:调用存储过程avggrade,计算1-5号课程的平均成绩 declare i int select i=1 while i=5beginexec avggrade iselect i=i+1end,实验:C#中
8、调用存储过程,数据库系统概论,DROP PROCEDURE 过程名,3. 删除存储过程,数据库系统概论,四、游标(cursor),游标 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果 每个游标区都有一个名字 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理,数据库系统概论,游标(续),为什么要使用游标 SQL语言与主语言具有不同数据处理方式 SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录 主语言是面向记录的,一组主变量一次只能存放一条记录 仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求 嵌入式SQL引入了游标的概念,
9、用来协调这两种不同的处理方式,数据库系统概论,游标(续),使用游标的步骤 1. 说明游标 2. 打开游标 3. 推进游标指针并取当前记录 4. 关闭游标,数据库系统概论,1. 说明游标,使用DECLARE语句 语句格式DECLARE CURSOR FOR ; 功能 是一条说明性语句,这时DBMS并不执行SELECT指定的查询操作。,数据库系统概论,2. 打开游标,使用OPEN语句 语句格式OPEN ; 功能 打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中 这时游标处于活动状态,指针指向查询结果集中第一条记录,数据库系统概论,3.推进游标指针并取当前记录
10、,使用FETCH语句 语句格式FETCH NEXT|PRIOR|FIRST|LAST FROM INTO , .,数据库系统概论,推进游标指针并取当前记录(续),功能 指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理 NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式NEXT:向前推进一条记录PRIOR:向回退一条记录FIRST:推向第一条记录LAST:推向最后一条记录缺省值为NEXT,数据库系统概论,4. 关闭游标,使用CLOSE语句 语句格式CLOSE ; 功能 关闭游标,释放结果集占用的缓冲区及其他资源 说明 游标被关闭后,就不再和原来的查
11、询结果集相联系 被关闭的游标可以再次被打开,与新的查询结果相联系,数据库系统概论,游标示例,在SC表中增加一个字段:Gradelevel char(1) 根据学生成绩计算成绩等级,保存到gradelevel中: 90-100为A, 80-89为B 70-79为C, 60-69为D 0-59为E 编写存储过程gradelevel 调用gradelevel :EXEC gradelevel,数据库系统概论,CREATE PROCEDURE dbo.gradelevel AS -mygrade:成绩,mylevel:级别. DECLARE mygrade int, mylevel char(1)-
12、下面定义游标. DECLARE level_cursor CURSOR FOR SELECT grade,gradelevel FROM sc- 下面打开游标. OPEN level_cursor- 下面从游标中取出第一行,放到对应的变量中. FETCH NEXT FROM level_cursor INTO mygrade, mylevel,数据库系统概论,-进入循环 WHILE FETCH_STATUS = 0 BEGIN- 计算级别.if mygrade is nullselect mylevel=nullelseif mygrade60select mylevel=Eelse if m
13、ygrade70 select mylevel=D else if mygrade80 select mylevel=C else if mygrade90 select mylevel=B else select mylevel=A,数据库系统概论,-修改中对应行的级别. update sc set gradelevel=mylevelwhere CURRENT OF level_cursor- 从游标中取下一行.FETCH NEXT FROM level_cursorINTO mygrade, mylevel END - 关闭游标. CLOSE level_cursor DEALLOCAT
14、E level_cursor,数据库系统概论,使用游标的SQL语句,必须使用游标的SQL语句 查询结果为多条记录的SELECT语句 CURRENT形式的UPDATE语句 CURRENT形式的DELETE语句,数据库系统概论,CURRENT形式的UPDATE语句和DELETE语句(续),如果只想修改或删除其中某个记录 用带游标的SELECT语句查出所有满足条件的记录 从中进一步找出要修改或删除的记录 用CURRENT形式的UPDATE语句和DELETE语句修改或删除之 UPDATE语句和DELETE语句中的子句: WHERE CURRENT OF 表示修改或删除的是最近一次取出的记录,即游标指针
15、指向的记录,数据库系统概论,不用游标的SQL语句(续),一、查询结果为单记录的SELECT语句 二、非CURRENT形式的增删改语句,数据库系统概论,存储过程小结,PL/SQL 存储过程的创建、调用、删除 在存储过程中使用游标,数据库系统概论,8.3 ODBC简介,ODBC产生的原因: 由于不同的数据库管理系统的存在,在某个RDBMS下编写的应用程序就不能在另一个RDBMS下运行 许多应用程序需要共享多个部门的数据资源,访问不同的RDBMS,数据库系统概论,ODBC简介(续),ODBC: 是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中有关数据库的一个组成部分 提供了一组访问数据库的标准API 已经ISO认证,成为国际标准 ODBC约束力: 规范应用开发 规范RDBMS应用接口,数据库系统概论,ODBC工作原理概述,数据库系统概论,创建ODBC数据源连接SQLServer数据库,创建一个连接学生-课程数据库的ODBC数据源 C#中使用ODBC数据源连接数据库,