Sybase存储过程的建立和使用

http://tech.ddvip.com   2007年07月31日    社区交流

内容摘要:存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。

  create procedure p_RsGz_JiNeng_Slt 
   (@c_GeRenId char(4),@sm_JinE smallmoney output) 
   as 
   select @sm_JinE=JinE 
   from RS_LS_GZ_JiNeng 
   where RiQi=(select max(RiQi) 
   from RS_LS_GZ_JiNeng 
   where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/ 

  调用存储过程p_RsGz_JiNeng_Slt进行查询: 

  declare @GeRenId char(4),@JinE smallmoney 
   select @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/ 
   select @JinE=0 
   execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output

  这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。 [page]

  例4.查到了个人代码为"0135"员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。 

  create procedure p_RsGz_JiNeng_Rtn 
   @c_GeRenId char(4) 
   as 
   declare @ErrCode smallint 
   select @ErrCode=0 
   if exists(select* from RS-LS-GZ-JiNeng 
   where GeRenid=@c-GeRenId) 
   begin 
     select * 
     from RS_LS_GZ_JiNeng 
     whrer GeRen_id=@c_GeRenId 
     order by RiQi 
     return @ErrCode 
   end 
   esle 
   begin 
     select @ErrCode=1 
     return @ErrCode 
   end 

  调用存储过程p_RsGz_JiNeng_Rtn: 

  declare @GeRenId char(4),@RtnCode smallint 
   select @GeRenId="0135" 
   select @RtnCode=0 
   execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId 
   if @RtnCode=1 
   print"No this one!" 

  存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为"查无此人",返回出错状态值1。否则,返回成功状态值0。 

  调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息"No this one!"。 [page]

  小结 

  上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。 

  虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。

责编:豆豆技术应用

正在加载评论...