我在一个主procedure中调用多个子procedure,如果其中一个子procedure报错,我希望能跳过去继续执行后面的子procedure,请问代码该如何写?
我的主procedure:
create or replace procedure test is
v_sqlcode number;
v_sqlmsg varchar2(200):='';
begin
test1(v_sqlcode);
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;test1:
create or replace procedure test1(v_sqlcode out number) is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into test values('tttttttt','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;
test2:
create or replace procedure test2(v_sqlcode out number) is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into xiazp_test values('t','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;table-test的第一个字段是varchar2(1),所以test1会报错。但我执行主procedure-test时,test1确实报错了,但test2也没有执行。请问该如何处理,谢谢!
我的主procedure:
create or replace procedure test is
v_sqlcode number;
v_sqlmsg varchar2(200):='';
begin
test1(v_sqlcode);
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;test1:
create or replace procedure test1(v_sqlcode out number) is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into test values('tttttttt','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;
test2:
create or replace procedure test2(v_sqlcode out number) is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into xiazp_test values('t','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;table-test的第一个字段是varchar2(1),所以test1会报错。但我执行主procedure-test时,test1确实报错了,但test2也没有执行。请问该如何处理,谢谢!
解决方案 »
- 求解:XP下DSN连接远程ORACLE出错
- SELECT * FROM aa WHERE LOADTIME LIKE '%0001-1-1 8:00:00%' 查不到结果,但是SELECT * 确有结果
- 关于序列的问题
- 请教erwin中ModelMart的保存问题
- 这样的功能如何实现?急!
- 问个异想天开的问题~~能查询到每个月的(周末+法定假日)的天数吗?
- 存储过程加游标,小弟有一个更改现有的大量数据的id列的问题
- 求助max用法
- 存储过程语句问题
- 请问oracle的Managerment Server为什么不能启动?
- 进程、实例与数据库有什么关系?
- 如何批量修改一张表中的一个字段中的特定符号
v_sqlcode number;
v_sqlmsg varchar2(200):='';
begin
begin
test1(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
null;
end;
begin
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
null;
end;
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;
create or replace procedure test is
v_sqlcode number;
v_sqlmsg varchar2(200) := '';
begin
begin
test1(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
Raise_application_error(-20001, v_sqlmsg);------多加几个begin ... end 就可以了。。
end;
begin
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
Raise_application_error(-20002, v_sqlmsg);
end;
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;
改成
dbms_output.put_line(sqlcode||' '||sqlerrm);
做处理,吃掉exception
catch里边不做任何处理就行了
create or replace procedure test is
v_sqlcode number;
v_sqlmsg varchar2(200):='';
begin
begin
test1(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
Raise_application_error(-20001, SQLERRM);------多加几个begin ... end 就可以了。。
end;
begin
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
Raise_application_error(-20001, SQLERRM);------多加几个begin ... end 就可以了。。
end;EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlmsg := SQLERRM;
ROLLBACK;
Raise_application_error(-20000, v_sqlmsg);
end;