存储过程示例如下:
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表找不到记录,请问这里要怎么做?谢谢 

解决方案 »

  1.   

    你的过程就有错,你的strsql没有参数为什么要加using
    如果要知道哪个表没有数据,各自捕获异常就可以了
      

  2.   

    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;
     
      --加上捕捉错误信息的异常处理
      exception
        when others then
          dbms_output.put_line(sqlcode||','||sqlerrm);     end;
    end proc_cancel_digital_id;
      

  3.   

    我想可以定义两个exception, 执行一个select 之后 抛出一个,看到底是那个没有找到。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 ;
    LZ麻烦你解释一下这几条语句是什么意思  我是刚学oracle,我只知道execute immediate里用using时,是因为语句中留的有占位符。 你这里为啥用呢???
      

  4.   

    我也是工作要用,才学了一天。strsql :='select name from student where age=100';
      execute immediate strsql using strAge ;
    正如 gelyon 所说确实用错,参数没有使用,我输入的时候弄错了。刚才又在网上查了一下,“定义两个exception, 执行一个select 之后 抛出一个,看到底是那个没有找到”,这是我想要的解决方法,谢谢。