Исключение Oracle не отображается Java Exception, когда процедура не останавливается - PullRequest
1 голос
/ 29 марта 2012

Мой java-код вызывает процедуру, и, если есть какое-либо исключение, он попадает в java SQLEXCEPTION. Все работает нормально, если есть исключение, которое вызывает остановку процедуры, но если исключение не останавливает процедуру, 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;

Это при запуске дает следующий вывод:

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:, равный нулю сообщения, и поэтому я не могу записать его. Однако, если есть исключение, такое как, скажем, таблица не найдена, которое приводит к тому, что процедура для выхода из кода Java отображает его. Как я могу зарегистрировать ошибку ORA-01476?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

На самом деле вы не генерируете исключения, вы просто выводите их с пакетом 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

2 голосов
/ 29 марта 2012

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

Именно поэтому не распространяется на клиента.

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

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

    dbms_output.put_line(sqlerrm);
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...