免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2705 | 回复: 2
打印 上一主题 下一主题

存储过程的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-08 10:48 |只看该作者 |倒序浏览
在执行存储过程中如果出现错误,存储过程默认会继续执行下面的语句,直到整个存储过程执行完毕后,才显示错误。
有没有什么办法在语句出错的时候,就报错直接跳出存储过程的运行。

论坛徽章:
0
2 [报告]
发表于 2006-09-16 15:53 |只看该作者
搞个output不就得了
举例说明


/* 交易金额统计 */
create procedure ProcGenStat_jyjetj
(
    @jyrq    char( ,         /* 交易日期 */
    @retcode char( 5) output,  /* 返回码   */
    @retmsg  char( 50) output  /* 返回信息 */
)
AS
BEGIN
    DECLARE @lstjjgh char(
    DECLARE @tjjgh char(
    DECLARE @lstrcode char( 4)
    DECLARE @trcode char( 4)
    DECLARE @lscy char( 2)
    DECLARE @cy char( 2)
    DECLARE @flag int
    DECLARE @cnt1 int
    DECLARE @cnt2 int
    DECLARE @cnt3 int
    DECLARE @cnt4 int
    DECLARE @cnt5 int
    DECLARE @amt1 money
    DECLARE @amt2 money
    DECLARE @amt3 money
    DECLARE @amt4 money
    DECLARE @amt5 money
    DECLARE @tmpje money

    /* 查找是否已经存在表记录 */
    if( EXISTS( select 1 from jyjetjb WHERE trdate = @jyrq))
    BEGIN
      SELECT @retcode = '99998', @retmsg = '已经存在记录!!'
      return 1003
    END

    /* 定义取记录游标 */
    DECLARE jyjetj_cur CURSOR FOR
    SELECT b.tjjgh, a.trcode, a.cy, a.amount
    FROM   zjywdbs..abisrec a, zjywdbs..tjjgdzb b
    WHERE  a.trdate = @jyrq
    AND    a.brchno = b.brchno
    AND    a.trcode not in ( '3985', '3986')
    AND    a.tlid not like '6_[a-z][a-z]'
    ORDER  BY a.trdate, b.tjjgh, a.cy

   /* 打开游标 */
    OPEN jyjetj_cur
    if( @@error <> 0)
    BEGIN
        SELECT @retcode = '99999', @retmsg = '系统操作错误!!'
        return 1001
    END

    /* 预赋值历史信息 */
    SELECT @lstjjgh = '', @lstrcode='', @lscy = '', @flag = 0

    /* 取首记录 */
    FETCH jyjetj_cur INTO @tjjgh, @trcode, @cy, @tmpje

    /* 循环取记录 */
    WHILE( @@sqlstatus != 2)
    BEGIN
        /* 判断错误信息 */
        if( @@sqlstatus = 1)
        BEGIN
            SELECT @retcode = '99998', @retmsg = '没有该记录!!'
            CLOSE jyjetj_cur
            return 1002
        END

        /* 赋值历史记录 */
        if( @lstjjgh <> @tjjgh OR @lstrcode <> @trcode OR @lscy <> @cy)
        BEGIN
            if( @flag = 1 AND @cnt1 + @cnt2 + @cnt3 + @cnt4 + @cnt5 > 0
              AND @amt1 + @amt2 + @amt3 + @amt4 + @amt5 > 0)
            BEGIN
              INSERT INTO jyjetjb
                   VALUES( @jyrq, @lstjjgh, @lstrcode, @lscy,
                   @cnt1, @amt1, @cnt2, @amt2, @cnt3, @amt3,
                   @cnt4, @amt4, @cnt5, @amt5)
            END
            SELECT @lstjjgh = @tjjgh, @lstrcode = @trcode, @lscy = @cy
            SELECT @cnt1 = 0, @cnt2 = 0, @amt1 = 0, @amt2 = 0
            SELECT @cnt3 = 0, @cnt4 = 0, @amt3 = 0, @amt4 = 0
            SELECT @cnt5 = 0, @amt5 = 0
            SELECT @flag = 1
        END

        /* 计算金额 */
        select @tmpje = ( -1) * @tmpje

        /* 统计记录 */
        if( @tmpje > 0 AND @tmpje <= 300.00)
        BEGIN
          SELECT @cnt1 = @cnt1 + 1, @amt1 = @amt1 + @tmpje /* 借方 */
        END
        else if( @tmpje > 300.00 AND @tmpje <= 500.00)
        BEGIN
          SELECT @cnt2 = @cnt2 + 1, @amt2 = @amt2 + @tmpje /* 借方 */
        END
        else if( @tmpje > 500.00 AND @tmpje <= 1000.00)
        BEGIN
          SELECT @cnt3 = @cnt3 + 1, @amt3 = @amt3 + @tmpje /* 借方 */
        END
        else if( @tmpje > 1000.00 AND @tmpje <= 5000.00)
        BEGIN
          SELECT @cnt4 = @cnt4 + 1, @amt4 = @amt4 + @tmpje /* 借方 */
        END
        else if( @tmpje > 5000.00)
        BEGIN
          SELECT @cnt5 = @cnt5 + 1, @amt5 = @amt5 + @tmpje /* 借方 */
        END

        /* 取首记录 */
        FETCH jyjetj_cur INTO @tjjgh, @trcode, @cy, @tmpje
    END

    CLOSE jyjetj_cur
    SELECT @retcode = '00000', @retmsg = '操作成功!'
    return 0
END

论坛徽章:
0
3 [报告]
发表于 2006-09-19 13:24 |只看该作者
return
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP