第13章 数据库对象9 T' t- g+ a, e
13.1 存储过程的:SQL语句和控制流语句的预编译集合,应用程序可通过调用方法来执行+ e) E A- B7 H6 a
优点:模块化程序设计;提高性能;减少网络流量;可作为安全机制使用) I8 ~; ]. U4 L0 P* _4 Y
13.2 带有多个参数并有默认值及输出参数的存储过程示例:
6 \$ }3 } ]5 }6 q0 PCREATE PROCEDURE p_Example
3 W' a" _9 h; i! D6 Q, {( H4 ^- b@area varchar(20) = ‘武汉大学’,@Price money,@Sum int output
: E4 t8 r$ r d$ YAS- T& M: [0 n# Z4 N; J
SELECT/UPDATE/INSERT/DELETE……
& u" ^; o% B' P& n* j6 kSET @Sum = …。.0 b) ` U" O7 v% ~. y8 l3 ]5 d
应用程序中执行的SQL语句:
% ~! ]' y" ^% f) A- zDeclare @res int k" d- Y6 _! D, d, O7 l
EXECUTE p_Example ‘武汉大学信息学部’,1000,@res output
( z$ y% c `0 C0 J5 \或者 EXECUTE p_Example @Price =1000,@res output
: s0 ^6 I! ? T6 M13.3 用户自定义函数:标量函数(返回单值,非text、Image类型,任何允许出现表达式的地方)、内嵌表值函数(返回一个表,放在查询语句的From子句中)、多语句表值函数(返回一个可自定义的表,也放在查询语句的From子句中,视图和存储过程的结合)
' Y$ T6 h% c8 |% d k% N- T13.4 标量函数救示例:根据指定的商品类别查询该类的商品个数。5 P+ p% H" A2 _1 Q
CREAT FUNCTION dbo.f_GoodsCount(@class varchar(10))6 x; [0 [! `& T8 j$ [) m w
RETURNS int
; `9 W! d% F bAS% E9 Z7 Y3 X2 L9 m. ^! T; A/ I! W
BEGIN
% ^+ r ]- X$ tDECLARE @x int2 N; m' K6 `- a2 v. L' n% t/ l
SELECT @x=count(*) From T_GoodsClass a JION T_Goods b
/ N9 I/ |6 J5 ]) O& nON a.GoodClassID = b.GoodClassID
; B/ F9 e! L6 ^& c* t& g& ~* |% oWHERE GoodClassName = @class
8 ?3 g7 F1 f: T$ E# sRETURN @x9 ]: B5 p6 d6 }0 \
END' U% }4 T$ K5 `9 l
调用:SELECT dbo.f_GoodsCount(‘服装’) 或者' H3 H' k' _ O; `; _
SELECT GoodsName AS 商品名,dbo.f_GoodsCount(‘服装’) AS 种类数 From …。: Y% i- ^0 L; [, v% X$ b0 e- U
13.5 内嵌表值函数的不同之处在于RETURNS 后只能是table,RETURN后面只能是单个的 SELECT语句,没有相关联的返回变量也没有函数体。调用时放在查询语句的FROM子句中。
: u5 i1 L1 \* \$ e$ G13.6 触发器是一种不需要由用户来调用的存储过程,当用户对表进行UPDATE、INSERT或DELETE操作时自动触发执行。作用:保证业务规则和数据完整性。优点:用编程方法来实现复杂的处理逻辑和业务规则,增强数据完整性约束。
7 P( S. v" Q4 [' s& o* x13.7 触发器适用场合:比CHECK语句更复杂的数据约束(可引用其他表中的列);为保证数据库性能而维护的非规范化数据(如增加统计总值的列);实现复杂的业务规则
9 P" T v% h. X; V5 H* j3 S/ Z* {13.8 AFTER/FOR:后触发型触发器,可在同一操作上建立多个;INSTEAD OF:前触发型,在同一操作上只能建立一个。所有的涉及对数据库对象操作的语句均不允许出现在触发器中。 |