a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 137|回复: 1

[考试辅导] Sybase存储过程的建立和使用分析

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
存储过程的特点   Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。/ n4 ]. V6 N; O' c" f
  存储过程的性能特点如下:" S/ p) P' m. v) D" V! w+ J$ P
  ·存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同,当首次运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很快。
1 m/ |1 B* ?/ h6 _  ·存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。
2 S$ d% B8 U7 F  ·存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。
$ r4 o! ?$ n, }4 J$ Q  g8 Y  ·存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。
2 K7 t! _0 v# U, `8 Z. Q  [  所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。0 t: l1 v! T7 ?) ?& Y8 ]
  存储过程的语法规则0 F$ n2 h) }' i4 H) V: g  v
  建立存储过程的语法规则为:
) `$ |3 {. f5 P9 A, R
) }1 Z) V. a2 G: a3 n( y. |+ B' ?/ l) q& m. \: ?8 ^
  CREATE PROCedure[owner.]procedurename[;number] 0 e% v+ h& g; D
  [[(]@parameter_name datatype[=default][OUTput]
" y- \& i' R% F3 |5 H5 A2 C0 V  [,@parameter_name datatype[=default][OUTput]]...[)]]
0 O5 n8 f3 f2 _( I( C  [WITH RECOMPILE]
: X% h( V: n& s8 S  AS SQL_statements' }  n; `1 Q- F0 K5 v4 Y: x
  使用存储过程的语法规则为:+ W0 N4 E8 e9 t/ @  b( A
& }2 a+ W" }. y0 [7 \5 x# R4 ~# U4 f9 b
, S$ C5 J; y* f7 b
  [EXECute][@return-status=]
  y! r7 J2 o4 M/ m3 U  [[[server.]database.]owner.]procedurename[;number] # F+ \9 D5 N' |  w
  [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput] : t8 Y& O- Z1 m4 p/ b1 ]" ]" k
  [,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]
& |. O% S3 m# f  [WITH RECOMPILE]
- w4 r4 ~5 w* I1 \5 n- U( X  t3 c+ V  
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Sybase存储过程的建立和使用分析

然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:</p>  execute p_RsGz_JiNeng_All
9 a) A1 u. B7 J: A* l  本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。
9 s. I5 U8 n) I7 G: k6 N) u* r  例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:$ Q+ }' A# J: w% z

9 a. d$ b9 }6 |1 k3 z
* k% c9 W4 ?. m9 R* r& Q, T0 N  create procedure p_RsGz_JiNeng @c_GeRenId char(4)
" K' O* t& Y) j9 i( U$ r; ]  as
9 v6 `3 h/ k7 r  select *from RS_LS_GZ_JiNeng 9 c  r8 v) O: N( u/ J% L& C6 v+ X% a
  where GeRen_id=@c_GeRenId $ A- ^( v; p3 t3 h$ o; P" `1 j
  order by RiQi
( C2 h1 ?' l) @* [  之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:
5 L7 g* d/ m" S. w+ _  declare @GeRenId char(4)
# A2 B" l: }5 ]& o3 q, D" ^  select @GeRenId="0135" /*设要查询员工的个人代码为"0135" */
- {: g2 C+ p/ y. F, l  execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
& d( M% k) e* _" W: `+ _6 d  存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。
! o- X8 `! ]" j: x4 m* N1 Y8 c  例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:
4 q7 R0 G3 h. |: F1 y+ w) H6 B# p1 ], X$ D, e9 G
5 ^4 I6 P/ o$ I/ C3 ]  x, k
  create procedure p_RsGz_JiNeng_Slt
: j  K3 P8 T$ q; e! j2 O- x  (@c_GeRenId char(4),@sm_JinE smallmoney output)
& }+ C% \+ T/ X: y7 p  as
, L; O" z8 ]4 j  select @sm_JinE=JinE
1 U; N' D1 J* w7 ~% h3 M4 S, A/ y  from RS_LS_GZ_JiNeng
, {. U" r) P( z7 Y5 Y  t( p  where RiQi=(select max(RiQi) . `6 f; y+ Q- q2 Z, W4 h( }$ x
  from RS_LS_GZ_JiNeng# L1 x9 s7 H6 z$ e
  where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/  e. o$ w0 e8 M( F# }& O
  调用存储过程p_RsGz_JiNeng_Slt进行查询:
( b! y: a6 p0 W. f0 G3 F8 k+ y; E  W. D$ X+ Q2 y. ?
- `0 H; O0 u0 q: i, b$ F6 Z
  declare @GeRenId char(4),@JinE smallmoney
3 E) G5 P( N  `) K  select @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/ 7 z" G1 d1 W4 \* V% f8 g
  select @JinE=0
9 n, \0 b8 `9 Y+ V9 T  execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output
2 r9 P! Z! l( Y( d# f  这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。7 Q) P" j( h' ~' @3 m, b8 W
  例4.查到了个人代码为"0135"员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。7 F2 i6 D8 v; n
" u; t  h# |9 v$ o7 w6 X
; O# @% E+ E" T. Z" r1 u2 |3 b
  create procedure p_RsGz_JiNeng_Rtn
' p) l5 ]% Z! ?, L; L- E  @c_GeRenId char(4) : s1 T1 E% Y/ J3 [& S
  as 3 e6 ~1 T4 _7 a' R7 e/ t' P1 }
  declare @ErrCode smallint
. P$ v% Y4 o: S) {  select @ErrCode=0
) w5 [, `* V/ ?. p) V) ]  if exists(select* from RS-LS-GZ-JiNeng ' t+ @0 v- u9 ~$ o) ^1 [- D
  where GeRenid=@c-GeRenId) ! X5 s+ R1 R9 _; G! w
  begin & ^6 G) l% i' d0 r
  select * % A1 f) ~! H" V3 Q
  from RS_LS_GZ_JiNeng 9 X- s& q7 O* X, \% d' }
  whrer GeRen_id=@c_GeRenId
1 V4 O1 t" J5 |9 O' z: s6 a  order by RiQi 5 d, ^1 b! ?/ }% z- o2 [& G
  return @ErrCodE
0 ?) o5 @3 |  w' b# w6 L7 o  end
% T- g0 G. H. M' u) R8 Y  D# E& b  eslE 0 |, }; b, d8 Q" m  e& @
  begin " Z% U- Z( ?, Y3 d3 w: ?/ ?* E# \
  select @ErrCode=1 2 q9 _; Z& r& L5 M0 m$ O0 o% B
  return @ErrCodE $ [" V$ l' Y9 c+ A" k, X4 l$ g
  end
0 _9 Y$ C% g3 U  调用存储过程p_RsGz_JiNeng_Rtn:' ^3 i4 C. e; Q4 m6 k& c

) h* B1 j. o  [2 ]% S7 D  A- K" i* G+ I
  declare @GeRenId char(4),@RtnCode smallint
8 l7 ~$ c4 e( R3 {  select @GeRenId="0135"
( X/ E" M) Q. o2 f4 m/ _" U% F  select @RtnCode=0 / r1 z' _" q1 b
  execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId   w+ C4 }9 p! B) W( J
  if @RtnCode=1 - a2 L* o% }9 B! Z+ O3 u# [
  print"No this one!"
' x+ o! i& Y0 e4 H* P% x' f1 `; M  存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为"查无此人",返回出错状态值1。否则,返回成功状态值0。
( G: a0 E5 M2 k# W  调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息"No this one!"。8 Z- j# [. s7 V2 C# f, p6 w/ N
  小结8 g* p# U! U3 f
  上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。: v* ^, F! n' ^
  虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 08:38 , Processed in 0.237953 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表