存储过程 急 在线等
问大家个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之前对所要取的值进行判断,如果不符合条件,就回滚或返回.当然第一个异常还是有用的.