第13章 数据库对象
4 L- a0 |' ]% i' L& z2 x4 }' b! ?13.1 存储过程的:SQL语句和控制流语句的预编译集合,应用程序可通过调用方法来执行- `8 |! M: d4 @8 c! w6 B& e2 {* m
优点:模块化程序设计;提高性能;减少网络流量;可作为安全机制使用- Z2 @' i+ ~+ J! H9 p k1 X# Y
13.2 带有多个参数并有默认值及输出参数的存储过程示例:! f5 V; b) `4 q8 K" M+ a, E. f
CREATE PROCEDURE p_Example% L% a2 `0 o+ S) M8 z" u
@area varchar(20) = ‘武汉大学’,@Price money,@Sum int output
& G) s2 h( C( {/ Q' i0 H7 NAS
% {4 P* D2 p5 Y) hSELECT/UPDATE/INSERT/DELETE……6 s& T( d4 l& U- k9 m/ H; ~
SET @Sum = …。.3 _/ q4 a1 _- F5 ~/ |
应用程序中执行的SQL语句:
`* P# s k k. |7 j7 }Declare @res int6 u7 A% m/ L3 ?* W; V
EXECUTE p_Example ‘武汉大学信息学部’,1000,@res output
; k/ M) w6 l6 V Z9 b( d或者 EXECUTE p_Example @Price =1000,@res output
+ g# T7 ?+ m/ i13.3 用户自定义函数:标量函数(返回单值,非text、Image类型,任何允许出现表达式的地方)、内嵌表值函数(返回一个表,放在查询语句的From子句中)、多语句表值函数(返回一个可自定义的表,也放在查询语句的From子句中,视图和存储过程的结合)
, _+ \, `0 I9 h; x" y7 t4 E13.4 标量函数救示例:根据指定的商品类别查询该类的商品个数。9 s- X7 L8 n9 h- y" X
CREAT FUNCTION dbo.f_GoodsCount(@class varchar(10))
. n9 v( r0 ~, {: t* W9 p* i) yRETURNS int
6 \9 G2 }& L) a4 mAS- r, A5 W$ b% W( k/ j
BEGIN
' x1 k0 ?8 M9 L1 z2 KDECLARE @x int
" F8 d6 Y3 S7 |/ V7 q ]1 ESELECT @x=count(*) From T_GoodsClass a JION T_Goods b* q1 f+ l# i4 e m) M- `( |3 U J
ON a.GoodClassID = b.GoodClassID# ]3 x* I# h% h, r
WHERE GoodClassName = @class
) y8 r" ^. h; g; }RETURN @x
+ ^7 ?- B1 f: J2 A3 H$ hEND
5 o8 k! L- F7 I' W调用:SELECT dbo.f_GoodsCount(‘服装’) 或者4 ]: h n: J- i7 i9 Z! U
SELECT GoodsName AS 商品名,dbo.f_GoodsCount(‘服装’) AS 种类数 From …。
; t# k2 k \3 m13.5 内嵌表值函数的不同之处在于RETURNS 后只能是table,RETURN后面只能是单个的 SELECT语句,没有相关联的返回变量也没有函数体。调用时放在查询语句的FROM子句中。
7 J5 ^2 c6 W- b6 E4 \! ], W5 V13.6 触发器是一种不需要由用户来调用的存储过程,当用户对表进行UPDATE、INSERT或DELETE操作时自动触发执行。作用:保证业务规则和数据完整性。优点:用编程方法来实现复杂的处理逻辑和业务规则,增强数据完整性约束。. C, L2 x l2 S5 h7 ]
13.7 触发器适用场合:比CHECK语句更复杂的数据约束(可引用其他表中的列);为保证数据库性能而维护的非规范化数据(如增加统计总值的列);实现复杂的业务规则. f# @ j( @/ |6 P
13.8 AFTER/FOR:后触发型触发器,可在同一操作上建立多个;INSTEAD OF:前触发型,在同一操作上只能建立一个。所有的涉及对数据库对象操作的语句均不允许出现在触发器中。 |