存储过程示例如下:
create or replace procedure proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
begin strsql :='select name from student where age=100';
execute immediate strsql using strAge ; strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ; ret_code:=0;
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_message := sqlerrm;
rollback;end;
end proc_cancel_digital_id;上面的存储过程是例子。
上面的任何一个select执行时,如果查不到数据都会抛异常。数据库返回码是100,找不到数据。
但是我想获得详细的错误信息,到底是上面的student找不到记录,还是teacher表找不到记录,请问这里要怎么做?谢谢
create or replace procedure proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
begin strsql :='select name from student where age=100';
execute immediate strsql using strAge ; strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ; ret_code:=0;
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_message := sqlerrm;
rollback;end;
end proc_cancel_digital_id;上面的存储过程是例子。
上面的任何一个select执行时,如果查不到数据都会抛异常。数据库返回码是100,找不到数据。
但是我想获得详细的错误信息,到底是上面的student找不到记录,还是teacher表找不到记录,请问这里要怎么做?谢谢
如果要知道哪个表没有数据,各自捕获异常就可以了
is
begin
declare
strsql varcchar(1024);
begin strsql :='select name from student where age=100';
execute immediate strsql using strAge ; strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ; ret_code:=0;
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_message := sqlerrm;
rollback;
--加上捕捉错误信息的异常处理
exception
when others then
dbms_output.put_line(sqlcode||','||sqlerrm); end;
end proc_cancel_digital_id;
execute immediate strsql using strAge ; strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ;
LZ麻烦你解释一下这几条语句是什么意思 我是刚学oracle,我只知道execute immediate里用using时,是因为语句中留的有占位符。 你这里为啥用呢???
execute immediate strsql using strAge ;
正如 gelyon 所说确实用错,参数没有使用,我输入的时候弄错了。刚才又在网上查了一下,“定义两个exception, 执行一个select 之后 抛出一个,看到底是那个没有找到”,这是我想要的解决方法,谢谢。