Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当过程未停止时,Java SQL异常未显示Oracle异常_Java_Oracle_Jdbc_Plsql_Sqlexception - Fatal编程技术网

当过程未停止时,Java SQL异常未显示Oracle异常

当过程未停止时,Java SQL异常未显示Oracle异常,java,oracle,jdbc,plsql,sqlexception,Java,Oracle,Jdbc,Plsql,Sqlexception,我的java代码调用一个过程,如果有任何异常,它会在JavaSQLException中被捕获。如果出现导致过程停止的异常,则一切正常,但如果异常未停止过程,java不会显示我们要记录的错误。以下是一个例子: 程序: create or replace procedure test_jdbc(Table_name IN VARCHAR2) is v_sql VARCHAR2(50); cursor c_test is select employee_id, employee_nu

我的java代码调用一个过程,如果有任何异常,它会在JavaSQLException中被捕获。如果出现导致过程停止的异常,则一切正常,但如果异常未停止过程,java不会显示我们要记录的错误。以下是一个例子:

程序:

create or replace procedure test_jdbc(Table_name IN VARCHAR2) is

  v_sql VARCHAR2(50);
  cursor c_test is
    select employee_id, employee_num from employee where rownum < 11;
  v_test c_test%rowtype;
BEGIN

  for v_test in c_test loop
    begin
      dbms_output.put_line(v_test.employee_id || ' - ' ||
                           v_test.employee_num);
      dbms_output.put_line('c_test%rowcount - ' || c_test%rowcount);
      if c_test%rowcount = 8 then
        v_sql := v_test.employee_id / 0;
      end if;
    exception
      when others then

        dbms_output.put_line(sqlerrm);

    end;

  end loop;

end test_jdbc;
以下是调用该过程的java代码:

String insertStoreProc = "{call test_jdbc(?)}";

        try {
            dbConnection = getDBConnection();
            callablestatement = dbConnection.prepareCall(insertStoreProc);

            callablestatement.setString(1, "Employee");

            // execute select SQL stetement

            callablestatement.execute();
            System.out.println("Procedure Complete!");




        } catch (SQLException e) {

            e.printStackTrace(System.err);
            System.err.println("SQLState: " +
                ((SQLException)e).getSQLState());

            System.err.println("Error Code: " +
                ((SQLException)e).getErrorCode());

            System.err.println("Message: " + e.getMessage());



        }

但是,我的java不显示
ORA-01476:
除数等于零的消息,因此我无法记录它。但是,如果存在导致过程退出的异常(如say table not found),java代码将显示该异常。如何记录
ORA-01476
错误?

实际上您并没有抛出异常,您只是使用
dbms\u output
包输出异常

begin
  -- my stuff
when others then
  dbms_output.put_line(sqlerrm); -- here is just a output, procedure will continue
end;
尝试此代码(使用
升高
):


然后您将看到在使用
SQLException

的块中发生的一些错误。实际上,您并没有抛出异常,您只是使用
dbms\u output
包输出它们

begin
  -- my stuff
when others then
  dbms_output.put_line(sqlerrm); -- here is just a output, procedure will continue
end;
尝试此代码(使用
升高
):


然后,您将看到在Oracle存储过程中处理异常的块中发生的一些错误

这就是为什么不会传播到客户端

我的建议是删除Oracle过程中的异常块或添加RAISE_APPLICATION_ERROR()

例外情况 当其他人

    dbms_output.put_line(sqlerrm);
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end;

您正在处理Oracle存储过程中的异常

这就是为什么不会传播到客户端

我的建议是删除Oracle过程中的异常块或添加RAISE_APPLICATION_ERROR()

例外情况 当其他人

    dbms_output.put_line(sqlerrm);
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end;

或者只放一行包含RAISE的内容;在异常处理程序中的dbms_输出之后。应该将现有异常重新提升到下一个最外层的处理程序;在异常处理程序中的dbms_输出之后。这应该会将现有的异常重新引发到下一个最外层的处理程序中。实际上,raise将帮助我在java中获取异常,但我的客户想知道,如果错误消息击中异常块,并且没有引发异常,并且允许该过程继续,我们是否有办法捕获错误消息。他们现在的做法是将一个输出参数传递给java,在java中有“dbms_output.put_line(sqlerrm)”来记录它。所以我想这是唯一的方法。如果我们不引发异常并且希望java知道它,则通过out参数传递错误,或者引发异常并让SQLEXception捕获它。有没有其他不涉及out参数的方法?实际上,raise将帮助我在java中获取异常,但我的客户想知道,如果错误消息击中异常块,并且没有引发异常,并且允许该过程继续,是否有方法可以捕获错误消息。他们现在的做法是将一个输出参数传递给java,在java中有“dbms_output.put_line(sqlerrm)”来记录它。所以我想这是唯一的方法。如果我们不引发异常并且希望java知道它,则通过out参数传递错误,或者引发异常并让SQLEXception捕获它。有没有其他不涉及out参数的方法?