第9章 t sql程序设计

37
9 9 Transact-SQL Transact-SQL 第第第第 第第第第

Upload: hanmo1988

Post on 31-May-2015

1.131 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: 第9章 t sql程序设计

第第 99 章 章 Transact-SQLTransact-SQL 程序设计程序设计

Page 2: 第9章 t sql程序设计

第 9 章 Transact-SQL 编程

了解Transact-SQL编程语言

设计程序—流程控制语句

分行处理程序—游标

Page 3: 第9章 t sql程序设计

了解 Transact-SQL 编程语言•定义批处理语句 批处理是一个或多个 SQL 语句的集合,从程序一次性发送到 SQL Server 2000 并编译为一个可执行单元,一次性执行。如果一个批处理中任何一条语句有语法错误,则整个批处理将不能编译和执行。

语法格式: GO

Page 4: 第9章 t sql程序设计

变量SQL Server 将变量分为局部变量和全局变量。1. 局部变量 局部变量是用户定义,必须以 @ 开头,在程序内声 明,并只能在该程序内使用。 (1) 局部变量的声明 DECLATE @< 局部变量名 > < 数据类型 >[,…n]

(2) 局部变量的赋值 SET|SELECT @< 局部变量名 >=< 表达式 >

Page 5: 第9章 t sql程序设计

例 9-1 声明一个 datetime 类型的局部变量。

DECLARE @date_var datetime例 9-2 声明两个局部变量。 DECLARE @var1 int , @var2 money例 9-3 用 SET 语句将查询结果赋给局部

变量并用 SELECT 语句显示局部变量的值。 declare @date_var datetime set @date_var=(select min(birthday)

from s) select @date_var as min_birthday

变量

Page 6: 第9章 t sql程序设计

例 9-1 声明一个 datetime 类型的局部变量。 DECLARE @date_var datetime例 9-2 声明两个局部变量。 DECLARE @var1 int , @var2 money例 9-3 用 SET 语句和 SELECT 语句为局部变量赋值。 DECLARE @var1 datetime,@var2 char(10) SET @var1 = getdate() SELECT @var2 = convert(char(10),@var1,102)例 9-4 用 SET 语句将查询结果赋给局部变量并用 SELECT

语句显示局部变量的值。 declare @date_var datetime set @date_var=(select min(birthday) from s) select @date_var as min_birthday

变量

Page 7: 第9章 t sql程序设计

2. 全局变量 全局变量是 SQL Server 系统内部使用的变量,以 @@ 开头。 例例 9-59-5 用全局变量查看 SQL Server 的版本、当前所使用的 SQL Server 服务器的名称以及所使用的服务名称等信息。 脚本:print ' 目前所用 SQL Server 的版本信息如下 :'

print @@VERSION

print ' 目前 SQL Server 服务器名称为: '+@@SERVERNAME

print ' 目前所用服务器为: '+@@SERVICENAME

变量

Page 8: 第9章 t sql程序设计

注释语句

注释语句是对程序代码的说明或暂时禁用,是程序代码中不编译执行的语句。 语法格式: --< 注释文本 >

或 /*

< 注释文本 >

*/

Page 9: 第9章 t sql程序设计

输出语句 需要查看程序结果时,可以使用输出语句。 语法格式: PRINT < 表达式 >

例例 9-69-6 输出变量的值。 脚本: declare @date_var datetime

set @date_var=(select min(birthday) from s)

print @date_var

Page 10: 第9章 t sql程序设计

定义语句块语句

在控制流程中需要执行两条或两条以上的语句,应该将这些语句定义为一个语句块(称为复合语句)。 语法格式: BEGIN

<SQL 语句 >|< 语句块 >

END

Page 11: 第9章 t sql程序设计

设计程序—流程控制语句

一、选择结构二、循环结构三、转移语句四、等待语句五、返回语句

Page 12: 第9章 t sql程序设计

选择结构

选择结构可以使用条件语句来实现。

语法格式: IF < 布尔表达式 >

<SQL 语句 >|< 语句块 >

[ELSE

<SQL 语句 >|< 语句块 >]

Page 13: 第9章 t sql程序设计

例例 9-7 9-7 查询学号为查询学号为 10011001 的学生。的学生。脚本: if exists(select sno from s where sno='000

1')

print ' 找到 '

else

print ' 未找到 '

例例 9-8 9-8 条件语句的嵌套。条件语句的嵌套。脚本:

选择结构

Page 14: 第9章 t sql程序设计

循环结构

循环结构可以使用循环语句来实现。 语法格式: WHILE < 布尔表达式 >

<SQL 语句 >|< 语句块 >

中断语句: BREAK

短路语句: CONTINUE

Page 15: 第9章 t sql程序设计

例 9-9 求 1~10 之间的素数和。脚本:

例 9-10 求 100~200 之间的全部素数。脚本:

循环结构

Page 16: 第9章 t sql程序设计

转移语句

转移语句将程序的执行流程无条件转移到指定的标号处。 语法格式: GOTO < 标号 >

定义标号时,应在标号名后面加上冒号。 GOTO 语句常用在循环语句和条件语句内,使程序跳出循环或进行分支处理。

Page 17: 第9章 t sql程序设计

例 9-11 求 10 的阶乘。脚本:DECLARE @s int,@times int set @s=1set @times=1label1:set @s=@s*@timesset @times=@times+1if @times<=10 goto label1print ' 结果为 :'+str(@s)

Page 18: 第9章 t sql程序设计

等待语句

等待语句挂起一个程序中语句的执行,直到指定的某一时间点到来或在一定的时间间断之后才继续执行。

语法格式: WAITFOR DELAY '< 时间间隔 >'|TIME '< 时间 >'

其中,时间间隔以及时间均为 datetime 类型,格式为“ hh:mm:ss” ,分别说明等待的时间长度和时间点,在 time 内不能指定日期。

Page 19: 第9章 t sql程序设计

例例 9-12 9-12 设置等待一小时后执行查询。设置等待一小时后执行查询。脚本: begin waitfor delay '1:00:00' select * from s end

例例 9-13 9-13 设置到十点整执行查询。设置到十点整执行查询。脚本: begin waitfor time '10:00:00' select * from s end

等待语句

Page 20: 第9章 t sql程序设计

返回语句

返回语句结束执行,使程序无条件返回,其后面的语句不再执行。 语法格式: RETURN [< 整数表达式 >]

存储过程可以使用 RETURN 语句向调用者返回一个整数值。在 SQL Server 2000 中,存储过程返回值为 0 时,表示存储过程成功执行。

Page 21: 第9章 t sql程序设计

分行处理程序—游标

在数据库开发过程中,使用 SELECT 语句查询,得到一个结果集,对这个结果集中的不同数据行,可能要做不同的处理。也就是要逐一处理每一个数据行。游标提供了一种比较好的解决方案。

Page 22: 第9章 t sql程序设计

游标概述

1. 概念 游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

2. 种类 Transact-SQL 游标、 API 游标、客户游标。

Page 23: 第9章 t sql程序设计

1. Transact-SQL 游标

Transact-SQL 游标是由 DECLARE CURSOR 语句定义的,主要用在 Transact-SQL 脚本、存储过程和触发器中。 Transact-SQL 游标主要用在服务器上,由从客户端发送给服务器的 Transact-SQL 语句或是批处理、存储过程、触发器中的 Transact-SQL 进行管理。 Transact-SQL 游标不支持提取数据块或多行数据。

Page 24: 第9章 t sql程序设计

使用游标

操作步骤 :

1. 声明游标(变量)。2. 打开游标。3. 从一个游标中提取信息。4. 关闭(释放)游标。

Page 25: 第9章 t sql程序设计

1. 声明游标

语法格式:DECLARE < 游标名 > [INSENSITIVE] [SCRO

LL] CURSOR

FOR <SELECT 语句 >

[FOR {READ ONLY | UPDATE [OF < 列名> [,...n]]}]

Page 26: 第9章 t sql程序设计

例 声明标准游标。例 声明标准游标。脚本: declare cur_c cursor for select cno,cname,credit from c

例 声明只读游标。例 声明只读游标。脚本: declare cur_c cursor for select cno,cname,credit from c for read only

例 声明更新游标。例 声明更新游标。脚本: declare cur_c cursor for select cno,cname,credit from c

for update

1. 声明游标

Page 27: 第9章 t sql程序设计

2. 声明游标变量语法格式: DECLARE @< 变量名 > CURSOR

建立游标变量与游标之间的关联。方法 1 :先声明游标和游标变量,然后用 SET 语句将游标赋给游标变量。 例: DECLARE c1 CURSOR

FOR SELECT * FROM s

DECLARE @cur_var CURSOR

SET @cur_var = c1

方法 2 :不声明游标,直接用 SET 语句将游标定义信息赋给游标变量。 例: DECLARE @cur_var CURSOR

SET @cur_var = CURSOR

FOR SELECT * FROM s

当游标变量和游标关联后,就可用游标变量代替游标名称。

Page 28: 第9章 t sql程序设计

3. 打开游标

游标声明后,如果要从游标中读取数据,必须打开游标。

语法格式: OPEN [GLOBAL] < 游标名 >|< 游标变量名 >

其中, GLOBAL 表示要打开的是一个全局游标。

Page 29: 第9章 t sql程序设计

4. 读取游标中的数据

当游标被打开后,就可以从游标中逐行地读取数据。 语法格式: FETCH

[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE {n|@nvar}

|RELATIVE {n|@nvar}]

FROM ]

{{ [GLOBAL] < 游标名 >}|<@ 游标变量 >}

[INTO @< 变量名 >[,...n]]

Page 30: 第9章 t sql程序设计

@@fetch_status变量

返回值 描 述

0 FETCH命令已成功执行

-1 FETCH命令失败或者行数据己超出了结果集

-2 所读取的数据已经不存在。

Page 31: 第9章 t sql程序设计

5. 关闭游标

(1)使用 CLOSE命令关闭游标

(2) 自动关闭游标

Page 32: 第9章 t sql程序设计

(1) 使用 CLOSE命令关闭游标

处理完游标中数据后,必须关闭游标来释放数据结果集和定位于数据记录上的锁。

语法格式 : CLOSE [GLOBAL] < 游标名 >|@< 游标变量> CLOSE 语句可以关闭游标,但不释放游标的数据结构。如果要再次使用游标,可用 OPEN命令重新打开。

Page 33: 第9章 t sql程序设计

(2) 自动关闭游标

如果在声明游标与释放游标之间使用了事务结构,则在结束事务时游标会自动关闭。

避免自动关闭的方法是使用语句: SET CURSOR_CLOSE_ON_COMMIT OFF

Page 34: 第9章 t sql程序设计

6. 释放游标

用 CLOSE命令关闭游标并没有释放游标占用的数据结构。使用 DEALLOCATE命令将释放游标占用的数据结构,游标使用的任何资源也随之释放。 语法格式: DEALLOCATE [GLOBAL] < 游标名 >|@< 游标变量>

游标的关闭指释放游标的结果集所占用的资源,游标的释放指释放游标占用的所有资源,当然也包括结果集占用的资源。

Page 35: 第9章 t sql程序设计

例 例 DEALLOCATEDEALLOCATE 的作用。的作用。

脚本:

6. 释放游标

Page 36: 第9章 t sql程序设计

游标应用实例

1. 用于游标的 UPDATE 语句的语法格式: UPDATE < 表名 >

SET <列名 > = {< 表达式 >|NULL|<select子句 >}[,…n]

WHERE CURRENT OF < 游标名 >

2. 用于游标的 DELETE 语句的语法格式: DELETE FROM < 表名 >

WHERE CURRENT OF < 游标名 >

Page 37: 第9章 t sql程序设计

例 游标的定位修改。 脚本:

例 游标的定位删除。 脚本:

例 将课程号为“ c001” 的课程成绩上浮 5% 。 脚本:

游标应用实例