按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
游标的适用范围
与表 索引以及其它的对象如触发机制和存贮过程不同 游标在创建以后并不作为一
个数据库对象来看待 所以 游标的使用会受到一些限制
警告 切记 无论何时要注意游标分配过的内存 尽管它的名字可能已经不存在了 当不
在使用游标的时候 或在进行游标能力之外的工作时 一定要记得关闭游标并将它
释放掉
可以在下列三种情况下创建游标
l 在会话中 — — 会话在用户登录以后开始 如果用户在登录进行 SQL SERVER 以后创建
了一个游标 那么游标的名字将一直存在到用户退出登录 用户不能再一次使用在本
266
…………………………………………………………Page 267……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
次登录中创建的游标名
l 在存贮过程中— — 游标在存贮过程的内部创建的好处在于只有当过程运行时它才真正
起作用 一旦过程退出了 则游标的名字将不再有效
l 在触发机制中— — 在触发机制中创建游标与在存贮过程中创建游标所受到的限制是相
同的
创建和使用存贮过程
存贮过程是一个专业数据库编程人员必须掌握的概念 存贮过程可以在最大程序上发
挥出 SQL 的潜能 该功能可以被如 C FORTRAN 或 VISUAL BASIC 象调用或执行自己
的函数一样地调用或执行 存贮过程应该是一组经过压缩处理的经常使用的一组命令 如
交叉表的查询 更新和插入操作 存贮过程允许程序员简单地将该过程作为一个函数来调
用而不是重复地执行过程内部的语句 而且 存贮过程还有些附加的优点
SyBase 工业有限公司是使用存贮过程的先驱 它早在 1980 年就在它的 SQL SERVER
中提供了存贮过程功能 这种过程是作为数据库的一部分被创建的 它与表 索引一样是
存贮在数据库的内部的 Transcat…SQL 允许在过程调用中提供输入或输出的参数 这种机
制可以让你写出通用的存贮过程并将变量传递给它
使用存贮过程的一个最大的优点在于它可以在设计的阶段执行 当在一个网站中执行
大批量的 SQL 语句时 你的应用程序会不停地不 SQL SERVER 进行通讯 这会使得网站
的负荷迅速增大 在多用户环境下通讯将异常繁忙 你的服务器将变得越来越慢 而使用
存贮过程可以在最大程序中减轻通讯负荷
当存贮过程执行时 SQL 语句将在服务器中继续运行 一些数据信息将会返回给用户
的电脑直至过程执行完毕 这会极大地提高性能并带来了附加的好处 存贮过程在第一次
执行时在数据库经过了编译操作 编译的映象将存贮在服务器的过程中 因此 你不必在
每一次执行它的时候都对它进行优化 这也使性能得到了提高
使用 Transcat…SQL 来创建存贮过程的语法如下
SYNTAX
create procedure procedure_name
''('@parameter_name
datatype '(length) | (precision '; scale')
267
…………………………………………………………Page 268……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
'= default''output'
'; @parameter_name
datatype '(length) | (precision '; scale')
'= default''output''。。。')''
'with repile'
as SQL_statements
运行存贮过程的 EXECUTE 命令的语法如下
SYNTAX
execute '@return_status = '
procedure_name
''@parameter_name =' value |
'@parameter_name =' @variable 'output'。。。''
'with repile'
例 13。5
本例使用例 13。4 的内容来创建一个简单的过程
INPUT
1》 create procedure Print_Artists_Name
2》 as
3》 declare @name char(30)
4》 declare @homebase char(40)
5》 declare @style char(20)
6》 declare @artist_id int
7》 create Artists_Cursor cursor
8》 for select * from ARTISTS
9》 open Artists_Cursor
10》 fetch Artists_Cursor into @name; @homebase; @style; @artist_id
11》 while (@@sqlstatus = 0)
12》 begin
13》 print @name
14》 fetch Artists_Cursor into @name; @homebase; @style; @artist_id
268
…………………………………………………………Page 269……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
15》 end
16》 close Artists_Cursor
17》 deallocate cursor Artists_Cursor
18》 go
你可以使用 EXECUTE 命令来执行 Print_Artists_Name 过程
INPUT
1》 execute Print_Artists_Name
2》 go
OUTPUT
Soul Asylum
Maurice Ravel
Dave Matthews Band
Vince Gill
Oingo Boingo
Crowded House
Mary Chapin…Carpenter
Edward MacDowell
例 13。5 是一个很小的存贮过程 但是 一个存贮过程中可以包含许多条语句 也就是说你
不必逐条地执行这些语句
在存贮过程中使用参数
例 13。5 是重要的第一步 因为它给出的CREATE PRODUCE 语句的最简单的用法 但
是 在看过它的语法以后你会发现 CREATE PRODUCE 语句有着比例 13。5 更多的内容 存
贮过程也可以接受参数并把它们输入到其中的 SQL 语句中 此外 数据可以通过输出参数
从存贮过程中返回
输入参数必须以@提示符开始 而且这些参数必须是 Transcat…SQL 的合法数据类型
输出参数也必须以@提示符开始 此外 OUTPUT 关键字必须紧跟着输出参数的名字 当
你在运行存贮过程时你必须给出 OUTPUT 关键字
例 13。6 给出了在存贮过程中使用输入参数的用法
269
…………………………………………………………Page 270……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
例 13。6
下面的存贮过程将选用所有发行媒体为 CD 的艺术家的名字
1》 create procedure Match_Names_To_Media @description char(30)
2》 as
3》 select ARTISTS。name from ARTISTS; MEDIA; RECORDINGS
4》 where MEDIA。description = @description and
5》 MEDIA。media_type = RECORDINGS。media_type and
6》 RECORDINGS。artist_id = ARTISTS。artist_id
7》 go
1》 execute Match_Names_To_Media 〃CD〃
2》 go
运行该语句将会得到下边的结果集
OUTPUT
NAME
Soul Asylum
Maurice Ravel
Vince Gill
Crowded House
Mary Chapin…Carpenter
例 13。7
本例中给出的输出参数的用法 在该例中将使用艺术家的 HOMEBASE 作为输入 过
程会将艺术家的名字作为输出
INPUT
1》 create procedure Match_Homebase_To_Name @homebase char(40); @name char(30) output
2》 as
3》 select @name = name from ARTISTS where homebase = @homebase
4》 go
1》 declare @return_name char(30)
2》 execute Match_Homebase_To_Name 〃Los Angeles〃; @return_name = @name output
3》 print @name
4》 go
270
…………………………………………………………Page 271……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
OUTPUT
Oingo Boingo
删除一个存贮过程