내 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
오류를 기록하려면 어떻게해야합니까?
하지만 내 클라이언트는 예외 블록에 도달하고 예외가 발생하지 않고 프로 시저가 계속 허용되는 경우 오류 메시지를 캡처 할 수있는 방법이 있는지 알고 싶어했습니다. 그들이 지금하는 방법은'dbms_output.put_line (sqlerrm) '이 존재하는 java에 출력 매개 변수를 전달하여 로그하는 것입니다. – Eosphorus
그래서 나는 그것이 유일한 방법이라고 생각합니다. 우리가 예외를 발생시키지 않으면 java가 out 매개 변수를 통해 오류를 전달하거나 예외를 발생시키고 SQLEXception을 catch하도록합니다. 매개 변수를 사용하지 않는 다른 방법이 있습니까? – Eosphorus
테이블에 삽입 오류가 또 다른 옵션입니다. –