Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103780656
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Sybase

2008-04-10 20:10:05

存储过程的建立和使用,我们将通过几个例子进行介绍。

假设有一个用下述语句生成的技能工资表RS-LS-GZ-JiNeng:

create table RS_LS_GZ_JiNeng/*技能工资表*/
(GeRen_id char(4),/*个人代码 */
RiQi smalldatetime,/*执行日期 */
YuanYin_id char(1) null,/*变动原因代码 */
JinE smallmoney)/*技能工资金额 */

该表存储着某单位员工多年来技能工资的历史档案。

例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p-RsGz-JiNeg-All:

create procedure p_RsGz_JiNeng_All as
    select *
    from RS_LS_GZ_JiNeng
    order by GeRenid,RiQi

然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:

execute p_RsGz_JiNeng_All

本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。 [page]

例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:

create procedure p_RsGz_JiNeng @c_GeRenId char(4)
    as
    select *from RS_LS_GZ_JiNeng
    where GeRen_id=@c_GeRenId
    order by RiQi

之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:

declare @GeRenId char(4)
select @GeRenId="0135"/*设要查询员工的个人代码为"0135" */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId

存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。

例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:

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!"。

小结

上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。

阅读(397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~