2012-03-29 87 views
1

我的java代码调用一个过程,并且如果有任何异常,它会被java SQLEXCEPTION捕获。一切正常,如果有一个异常,导致过程停止,但如果异常不会停止过程java不会显示我们要记录的错误。这里有一个例子:Oracle异常不被Java SQL显示异常当程序不停止

步骤:

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; 

这在运行时给出了以下的输出:

0 - 1 
c_test%rowcount - 1 
0 - 2 
c_test%rowcount - 2 
0 - 3 
c_test%rowcount - 3 
0 - 4 
c_test%rowcount - 4 
0 - 5 
c_test%rowcount - 5 
0 - 6 
c_test%rowcount - 6 
0 - 7 
c_test%rowcount - 7 
0 - 8 
c_test%rowcount - 8 
ORA-01476: divisor is equal to zero 
0 - 9 
c_test%rowcount - 9 
0 - 10 
c_test%rowcount - 10 

PL/SQL procedure successfully completed 

这里是我的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这样的异常,导致过程退出java代码,则会显示它。我怎样才能记录ORA-01476错误?

回答

3

其实你没有抛出异常,你只是用dbms_output包输出它们。

begin 
    -- my stuff 
when others then 
    dbms_output.put_line(sqlerrm); -- here is just a output, procedure will continue 
end; 

试试这个代码(与raise):

begin 
    -- my stuff 
when others then 
    dbms_output.put_line(sqlerrm); 
    raise; 
end; 

然后你会看到一些错误,在块发生与SQLException

+0

那么实际上提出的是要帮我得到的异常在Java中,但我客户端想知道是否有方法可以捕获错误消息,如果它碰到异常块并且不会引发异常并且允许该过程继续。现在他们做的方式是通过将输出参数传递给存在'dbms_output.put_line(sqlerrm)'的java来记录它。 – Eosphorus 2012-03-29 16:38:32

+0

所以我想这是做到这一点的唯一方法。如果我们不引发异常,并且我们希望java知道它通过out参数传递错误或引发异常并让SQLEXception捕获它。有没有其他方式不涉及参数? – Eosphorus 2012-03-29 16:38:54

+0

在表中插入错误是另一种选择。 – 2012-03-29 17:00:43

2

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

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

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

例外 当别人再

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

或者只是放一行含有RAISE的行;在异常处理程序中的dbms_output之后。这应该将现有的例外重新提升到下一个最外层的处理程序。 – 2012-03-29 16:37:28