日期:2014-05-17  浏览次数:20794 次

存储过程 急 在线等
问大家个oracle   存储过程的事情。。。     我在一个存储过程里    
写了这样一条语句
update   vehicle_main   set   tolltodate=v_NewTime   where   vehicleid=v_vehicleid;
              if   sql%notfound   then
                    raise   exception_cannotExec;
              end   if;
              .....
commit;
        EXCEPTION
        WHEN   OTHERS   THEN
        BEGIN
                  INTRESULT:=0;
                  ROLLBACK;
        END;

v_NewTime(date)     和v_vehicleid   (int)   都是变量
exception_cannotExec;     自定义异常
执行的时候这两个值都是正确的。。。
但是     有的时候看结果这个语句就是没有执行。。。。。
也不报异常。。。
下面的语句都执行成功了  
但重新执行一边又好了。。。。

------解决方案--------------------
但是 有的时候看结果这个语句就是没有执行。。。。。
也不报异常。。。

EXCEPTION
WHEN OTHERS THEN
BEGIN
INTRESULT:=0;
ROLLBACK;
lz
你的最外层的异常处理是rollback啊,而且不提示。所以:
就是你看到的情况拉
------解决方案--------------------
EXCEPTION
WHEN OTHERS THEN
BEGIN
INTRESULT:=0;
ROLLBACK;
dbms_output.put_line( '遇到未知错误!! ');
END;
------解决方案--------------------
DECLARE aa INT;
exc_1 EXCEPTION;
BEGIN
aa:=1;
IF aa=1 THEN
RAISE exc_1;
END IF;
aa:=2;
IF aa=1 THEN
RAISE exc_1;
END IF;
COMMIT;
EXCEPTION
WHEN exc_1 THEN
DBMS_OUTPUT.PUT_LINE( '1 ');

WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( 'other ');
ROLLBACK;
END;

--
结果
1
------解决方案--------------------
dk9761(King) ( ) 信誉:100 Blog 2007-01-17 12:06:01 得分: 0


这个 我也用过。。。。 不过他不会走到这一步。。。不会走到 Exception 因为在前边没有抛出过异常


--
是否是别的地方的问题啊
------解决方案--------------------
--lz好好检查一下吧

DECLARE aa INT;
exc_1 EXCEPTION;
BEGIN
aa:=1;
IF aa=1 THEN
RAISE exc_1;
END IF;
aa:=2;
IF aa=1 THEN
RAISE exc_1;
END IF;
COMMIT;
EXCEPTION
WHEN exc_1 THEN
DBMS_OUTPUT.PUT_LINE( '1 ');
aa:=2;
DBMS_OUTPUT.PUT_LINE(aa);
ROLLBACK;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( 'other ');
ROLLBACK;
END;

--
结果
1
2
------解决方案--------------------
如果update可以取到记录,但set值是空时,是不会报错的,空值也会被认为正确赋值,除非表有约束,不允许set字段为空,这时也就会报错.
------解决方案--------------------
更新的表应该没有问题.如果表vehicle_main中where vehicleid=v_vehicleid至少能查出一条记录来,后面的异常都不会发生,所以exception对update操作基本没用.最好在update之前对所要取的值进行判断,如果不符合条件,就回滚或返回.当然第一个异常还是有用的.