比如一段事务
BEGIN TRANSACTION DeleteSupv
    --SQL语句 
    IF @@error<>0
 BEGIN  
        ROLLBACK TRAN DeleteSupv 
  GOTO on_error
 END 
    --SQL语句 
    IF @@error<>0
 BEGIN  
        ROLLBACK TRAN DeleteSupv 
  GOTO on_error
 END
COMMIT TRAN DeleteSupvRETURN 1
on_error:
    print 'Error occured' 
当事务发生错误回滚时,有办法知道 是执行那一段SQL出错的吗 oracle和sql server中如何做到如果可以 那程序当中 用什么对象(connection,statement,resultset?) 如何获取到上面DB获取的 是执行那一段 SQL出错的位置呢

解决方案 »

  1.   


    在oralce的alert日志里面有记载的。
      

  2.   

    在sp自己定义不同sql语句块对应的exception
      

  3.   

    你在exception中输出出错时的sql语句,这样执行过程就会很清楚了。
      

  4.   


    比方说我一个事务分3步,第二步报错了,控制台oracle会报一个错,我自己调试知道,但是我现在要把这个错误信息包装一下,然后告诉用户,你操作的第二步时发生错误,程式里面只能看见保存的信息,并不能判断是第几步报错啊
      

  5.   


    不错,自己可以抛出异常出来,但是这样的话,你自己需要先知道是哪些sql出的问题,才能在异常里面显示出来啊!
      

  6.   

    这个我觉得还是蛮有难度的。有一个办法应该可以,就是查Oracle的系统日志。
      

  7.   

    我倒,我要将异常信息封装好,然后正确提示是哪步出了问题告诉给User,不是我自己调试程序时不知道是哪里出了问题
      

  8.   


    如果oracle的存储过程报错,如果是java的话,获取exception,里面都会记录是哪个存储过程报错的,在哪行报错,然后ora错误是什么,都会有的。
      

  9.   


    呵呵,大菜鸟路过,据我所知,java里面的exception完全可以达到你的要求。
      

  10.   


    照你这么说,ora那么多错误,比如ora-0001 ora-0002.....ora-99999 我都判断下呢? 直接报的异常我调试是能看明白,但我程式怎么封装?比如报了个主键冲突,如果我三步都是插入语句,能判断是哪一句发生的主键冲突吗?请注意,调试时我自己能看明白,但是控制台打印出那么多语句,我怎么分类,还有,根本就没用存储过程
      

  11.   

    唉,算了,到最后可能会讨论到,如何分析报出的exception语句怎么判断,变成了 纯字符串 分析问题了,搞得google怎判断用户输入关键字然后判断一样
      

  12.   

    可以结合ado.net里面对数据库户滚的操作。不在SQL里面写。