2012-03-29 5 views
1

내 java 코드가 프로 시저를 호출하고 예외가 발생하면 java SQLEXCEPTION에서 catch됩니다. 프로 시저를 멈추게하는 예외가 있지만 예외가 프로 시저를 중지시키지 않으면 java가 기록하려는 오류를 표시하지 않는 경우 모두 제대로 작동합니다. 다음은 예입니다프로 시저가 중지되지 않을 때 Java SQL 예외로 Oracle 예외가 표시되지 않습니다.

절차 :

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 

내 자바 코드 절차 호출

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()); 



     } 

을 그러나 내 자바 ORA-01476: 제수가 제로 메시지와 동일하므로 표시 할 표시되지 않으며 따라서 수 없습니다. 그것을 기록하십시오. 그러나 거기에 테이블을 찾을 수 없다는 예외가 발생하면 프로 시저가 자바 코드를 종료하게됩니다. 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; 

이 그런 다음 당신은 Oracle 저장 프로 시저에서 예외를 처리하는 SQLException

+0

하지만 내 클라이언트는 예외 블록에 도달하고 예외가 발생하지 않고 프로 시저가 계속 허용되는 경우 오류 메시지를 캡처 할 수있는 방법이 있는지 알고 싶어했습니다. 그들이 지금하는 방법은'dbms_output.put_line (sqlerrm) '이 존재하는 java에 출력 매개 변수를 전달하여 로그하는 것입니다. – Eosphorus

+0

그래서 나는 그것이 유일한 방법이라고 생각합니다. 우리가 예외를 발생시키지 않으면 java가 out 매개 변수를 통해 오류를 전달하거나 예외를 발생시키고 SQLEXception을 catch하도록합니다. 매개 변수를 사용하지 않는 다른 방법이 있습니까? – Eosphorus

+0

테이블에 삽입 오류가 또 다른 옵션입니다. –

2

와 블록에서 일어난 몇 가지 오류가 발생합니다.

그래서 클라이언트에 전파되지 않습니다.

내 조언은 RAISE_APPLICATION_ERROR()

예외 오라클 프로 시저에서 예외 블록을 제거하거나 추가 할 때 다른 사람 다음

dbms_output.put_line(sqlerrm); 
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end; 
그럼 실제로 나 자바에서 예외를 얻을 도움이 될 것입니다 인상
+4

아니면 그냥 RAISE를 포함하는 줄을 넣으십시오. 예외 핸들러의 dbms_output 뒤에. 기존의 예외를 다음 가장 외부의 처리기로 다시 제기해야합니다. –