2012-03-29 1 views
1

Мой код Java вызывает процедуру, и если есть какое-либо исключение, она попадает в java SQLEXCEPTION. Все работает нормально, если есть исключение, из-за которого процедура останавливается, но если исключение не останавливает процедуру, java не отображает ошибку, которую мы хотим зарегистрировать. Вот пример:Oracle Exception не отображается 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 not found, из-за которого процедура выхода из 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, но мой клиент хотел знать, был ли способ захватить сообщение об ошибке, если он попал в блок исключений, и исключение не возникает, и процедура разрешена для продолжения. То, как они это делают, заключается в передаче выходного параметра в java, где присутствует 'dbms_output.put_line (sqlerrm) 'для его регистрации. – Eosphorus

+0

Так что, я думаю, это единственный способ сделать это. Если мы не создадим исключение, и мы хотим, чтобы Java знал, что он передает ошибку через параметр out или создает исключение и имеет SQLEXception. Есть ли другой способ, не включающий параметр? – Eosphorus

+0

Вставить ошибки в таблицу - это еще один вариант. –

2

Вы обработки исключений в Oracle хранимой процедуры.

Вот почему не распространяется на клиента.

Мой совет, чтобы удалить блок исключений в процедуре Oracle или добавить raise_application_error()

исключение когда другие тогда

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

Или просто поместите строку, содержащую RAISE; после dbms_output в обработчике исключений. Это должно повторно поднять существующее исключение на следующий внешний обработчик. –