oracle 存储过程基础知识3

引用对象

SQL Server 允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过 程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。 有关更多信息,请参见延迟名称解析和编译。51Testing软件测试网q]}[&J8Qo/CF1C&b

%Oa Mr!s%m~h/py `0 延迟名称解析和兼容级别51Testing软件测试网+oY)m"F;}.?es

51Testing软件测试网-f9xrS6Ib/S ~%R/r5H

SQL Server 允许 Transact-SQL 存储过程在创建时引用不存在的表。这种能力称为延迟名称解析。不过,如果 Transact-SQL 存储过程引用了该存储过程中定义的表,而兼容级别设置(通过执行 sp_dbcmptlevel 来设置)为 65,则在创建时会发出警告信息。而如果在运行时所引用的表不存在,将返回错误信息。有关更多信息,请参见 sp_dbcmptlevel 和延迟名称解析和编译。

W? @e1~vo�oU0 51Testing软件测试网|Y#}bT2WnG ,B?'Teg&Z Q�ns0 Wg1x pd#R5Y{8n0 执行存储过程51Testing软件测试网/y$mWk:`5o:Q
成功执行 CREATE PROCEDURE 语句后,过程名称将存储在 sysobjects 系统表中,而 CREATE PROCEDURE 语句的文本将存储在 syscomments 中。第一次执行时,将编译该过程以确定检索数据的最佳访问计划。

使用 cursor 数据类型的参数
7yo#{v{"b6X0 存 储过程只能将 cursor 数据类型用于 OUTPUT 参数。如果为某个参数指定了 cursor 数据类型,也必须指定 VARYING 和 OUTPUT 参数。如果为某个参数指定了 VARYING 关键字,则数据类型必须是 cursor,并且必须指定 OUTPUT 关键字。51Testing软件测试网 x"[2l/d4~l

z+d:r7b0D:I6X.E7L.w0
AJ~rk0 说 明 cursor 数据类型不能通过数据库 API(例如 OLE DB、ODBC、ADO 和 DB-Library)绑定到应用程序变量上。因为必须先绑定 OUTPUT 参数,应用程序才可以执行存储过程,所以带有 cursor OUTPUT 参数的存储过程不能通过数据库 API 调用。只有将 cursor OUTPUT 变量赋值给 Transact-SQL 局部 cursor 变量时,才可以通过 Transact-SQL 批处理、存储过程或触发器调用这些过程。


Cursor 输出参数
&/"h0^(o%H/V]&B0 在执行过程时,以下规则适用于 cursor 输出参数:P"_#o yh/b[xP0 51Testing软件测试网i3EKo P

对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行,例如:51Testing软件测试网 G+DEr{){/J@o
在过程中的名为 RS 的 100 行结果集上打开一个非滚动游标。

5W0u&B*XstD0

c8W|D1b%` d0 51Testing软件测试网 I}~4h(o5`&@ ~!n
过程提取结果集 RS 的头 5 行。51Testing软件测试网*z8b^9A}ktJ.Hl

51Testing软件测试网N"lmh3Tq(BCw

51Testing软件测试网,^ZC"}VB|(zK`
过程返回到其调用者。

$LH4dRq4Q NZz0 51Testing软件测试网a4F;E3e/B&AW8x

51Testing软件测试网�C N9p m /a0r/~4fA$/
返回到调用者的结果集 RS 由 RS 的第 6 到 100 行组成,调用者中的游标处于 RS 的第一行之前。51Testing软件测试网Su5giEx%Q2J l
对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。

5v.PVB ZS~A0

J+n#v0y:g+UgQ0 51Testing软件测试网7K A'R1UUm,]
对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处理、存储过程或触发器返回空结果集。51Testing软件测试网8lyIs_d'~8@;`-Z

51Testing软件测试网l Uq!fvU%^ f

说明 空结果集与空值不同。

T%C,F(@E:hZ-v/u1a0 51Testing软件测试网@_)c4HO9gE'd

对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。

V"M*Ag|r0

$k`4m`Q&w 对于任意类型的游标,如果游标关闭,则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。51Testing软件测试网:I W f&o;@/Q{ 51Testing软件测试网pI [ Z'w'/c7m6V8j@

说明 关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。

临时存储过程51Testing软件测试网8OFB#Bl�z2^,d
SQL Server 支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只能由创建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束 时自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的会话结束时。wH]t[-Q0 51Testing软件测试网|$a$a c5OH

临时过程用 # 和 ## 命名,可以由任何用户创建。创建过程后,局部过程的所有者是唯一可以使用该过程的用户。执行局部临时过程的权限不能授予其他 用户。如果创建了全局临时过程,则所有用户均可以访问该过程,权限不能显式废除。只有在 tempdb 数据库中具有显式 CREATE PROCEDURE 权限的用户,才可以在该数据库中显式创建临时过程(不使用编号符命名)。可以授予或废除这些过程中的权限。

(_ la5N7sF n,@7Bu0 51Testing软件测试网(h|Gb3n;hM


:v-h6CWc.g0 说明 频繁使用临时存储过程会在 tempdb 中的系统表上产生争用,从而对性能产生负面影响。建议使用 sp_executesql 代替。sp_executesql 不在系统表中存储数据,因此可以避免这一问题。51Testing软件测试网0| c'T7C7T

^8D K,dOP"IBa0
t} CMvKk.v0 自动执行存储过程51Testing软件测试网*r)pNEhH
SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。51Testing软件测试网5g O3B6o4zj

6vk;{pqDQ,[0 对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。

|:ZLc!T7w0

,r(j Ll$h,LG#L0 在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 SQL Server(使用 -f 标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记。

!dN3p+sA&W0

#|+f k]b|0 若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在 master 数据库中创建存储过程。

Y]Qo'~)c.km0

@B9Zgi5Np b{.w0 使用 sp_procoption 可以:

[1M{E t7_lV0 51Testing软件测试网.q a6n/QfI

将现有存储过程指定为启动过程。51Testing软件测试网M'IADQ1XT0t7g}D

51Testing软件测试网![5L,B,yO 停止在 SQL Server 启动时执行过程。

查看 SQL Server 启动时执行的所有过程的列表。
I�wF.M6kS%}6b!I0 存储过程嵌套51Testing软件测试网7x;YOX*x+p{B
存储过程可以嵌套,即一个存储过程可以调用另一个存储过程。在被调用过程开始执行时,嵌套级将增加,在被调用过程执行结束后,嵌套级将减少。如果超出最大的嵌套级,会使整个调用过程链失败。可用 @@NESTLEVEL 函数返回当前的嵌套级。51Testing软件测试网5c#UF8KT5R#L

a j2`#t,a-P,V#G0 若要估计编译后的存储过程大小,请使用下列性能监视计数器。

rq5L`V$TQ/0 51Testing软件测试网}g*W9u]E(qI3M

性能监视器对象名 性能监视计数器名称
O'~#Z2yzm5lqLw0 SQLServer:缓冲区管理器 高速缓存大小(页面数)
O)M5Q'Ieb0a!Z^0 SQLServer:高速缓存管理器 高速缓存命中率51Testing软件测试网 @zP6]h
高速缓存页51Testing软件测试网,^Fl%L rA!D
高速缓存对象计数*51Testing软件测试网;AY%Hs^^9E s| a

$}Q ct%`(J8a0
G vKpui ^�},d0 * 各种分类的高速缓存对象均可以使用这些计数器,包括特殊 sql、准备 sql、过程、触发器等。51Testing软件测试网1^LT'L^(b.n8r"v

%d[ Q,a| I9E0 有关更多信息,请参见 SQL Server:Buffer Manager 对象和 SQL Server:Cache Manager 对象。51Testing软件测试网io;c4G$X

m%u1Lq%S(g:ZH0 sql_statement 限制51Testing软件测试网 ]`2D7@j&{:`)W^ZF
除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 之外(这两个语句必须是批处理中仅有的语句),任何 SET 语句均可以在存储过程内部指定。所选择的 SET 选项在存储过程执行过程中有效,之后恢复为原来的设置。51Testing软件测试网+a1@$e4u-r9g*e

51Testing软件测试网 _wVX:IZP*X

如果其他用户要使用某个存储过程,那么在该存储过程内部,一些语句使用的对象名必须使用对象所有者的名称限定。这些语句包括:

U4u'ToG*OR7A+?7P4~0 51Testing软件测试网'D:~-FPl1[,G/UY

ALTER TABLE51Testing软件测试网aX!M5zO*^]

51Testing软件测试网Q-i1d6M�k/Jj


irqY$B K0 CREATE INDEX

S8r#z*T m3y DA0 51Testing软件测试网:c~1lJ:pE


je#k+c-e3`A0 CREATE TABLE

J4XjU2yVG0

u I L`$o/]dy1Q*];?~~0
w+`etM/h1FiI0 所有 DBCC 语句51Testing软件测试网C#DV&//He4E t

51Testing软件测试网;S6e `aE1J8C


EI�nue7R!l ?W0 DROP TABLE51Testing软件测试网]%/eeo@x b~S

~Jm6vp _7^,lHK0
QDx)BT|*I0 DROP INDEX

2@{%j:pC r m / G0 51Testing软件测试网 y#qjK~5D


}/VWMR+/}7wo-_T0 TRUNCATE TABLE51Testing软件测试网/z-/hDj�`#j

51Testing软件测试网b^P-D0r�L�e4g


?!s9iTd?/j0 UPDATE STATISTICS51Testing软件测试网^3h6p'F;migh*M
权限51Testing软件测试网6Eti2vQk"`4D3p
CREATE PROCEDURE 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将 CREATE PROCEDURE 权限转让给其他用户。执行存储过程的权限授予过程的所有者,该所有者可以为其它数据库用户设置执行权限。

sog*a w1o#]0n+].irF b0 51Testing软件测试网1|3Ib(F)hj

示例
1vR,C+XX]0 A. 使用带有复杂 SELECT 语句的简单过程51Testing软件测试网H5A,P5cy GV
下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。51Testing软件测试网cCJS9rx C z

-Y�[RN)qv0 USE pubs51Testing软件测试网0AWX:H+A!u
IF EXISTS (SELECT name FROM sysobjects51Testing软件测试网dLX P1U
         WHERE name = 'au_info_all' AND type = 'P')51Testing软件测试网x!Ml,I ZD[[
   DROP PROCEDURE au_info_all51Testing软件测试网2xK5q*MPi,oA gq'o
GO
f+IB�kV"xM/H m0 CREATE PROCEDURE au_info_all
sS1s"dWt@'V$A0 AS
Q}+x Pgo[0 SELECT au_lname, au_fname, title, pub_name51Testing软件测试网BC:ZQk h%f0IR _'v
   FROM authors a INNER JOIN titleauthor ta51Testing软件测试网#ueH U`
      ON a.au_id = ta.au_id INNER JOIN titles t51Testing软件测试网F"BZ+Bl/z[
      ON t.title_id = ta.title_id INNER JOIN publishers p51Testing软件测试网'Un%l1AC+_z:d
      ON t.pub_id = p.pub_id51Testing软件测试网)^}:BKio
GO

4C%` K.pZ2s5~!{&a!y i0 51Testing软件测试网3jq+w2m9d)YI

au_info_all 存储过程可以通过以下方法执行:

j]h'VS-q-Y0

e5R0tW#tB#x n*u0 EXECUTE au_info_all
Ul,~)Yg0 -- Or51Testing软件测试网p6K*/:V&RkI~2J4Q
EXEC au_info_all

t6W@ZG{p?Lx0 51Testing软件测试网O7e Lb|e2U

如果该过程是批处理中的第一条语句,则可使用:51Testing软件测试网T1Xy8aQ�/

51Testing软件测试网 wy5i7Rc

au_info_all

N5^R7k ^ o"{0

%JB't//3V0 B. 使用带有参数的简单过程51Testing软件测试网m8|y#DbROb
下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。该存储过程接受与传递的参数精确匹配的值。51Testing软件测试网O Js O2wR

v*N|mZ$X(d?0 USE pubs

SQL Server 允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过 程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。 有关更多信息,请参见延迟名称解析和编译。 51Testing软件测试网]&y

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值