Как проверить правильность создания процедуры Oracle с помощью java?

Я делаю простой инструмент (использую), который выполняет сценарий Oracle из текстового файла. он работает нормально, но при выполнении процедуры создания или триггера, если ошибка возникает из-за оракула, java не генерирует никаких исключений, и в том же сценарии создание любой таблицы или выполнение выбора / вставки / удаления вызывает исключение с ошибкой. поэтому мой вопрос в том, как отловить ошибку при выполнении скрипта создания процедуры / триггера? Спасибо.

Пример: эту функцию (это может быть процедура, триггер) мне нужно для создания Oracle.

create or replace function fn_get_contract_invoice_amt(I_CompanyId varchar2, 
I_ContractNo Varchar2, I_Date1 Date, I_Date2 Date)
return number is
V_Amount    Number(13,3);
begin
 begin
  Select sum(nvl(Amount,0)) into v_Amount
  From Invmast im
  Where Company_id = I_CompanyId
  and   Contract_No = I_ContractNo
  and   Tran_Date between I_Date1 and I_Date2
  and   Deleted = 'N'
  and   Posted = 'Y';
 Exception
When No_Data_Found Then
  V_Amount := 0;
End;
  Return nvl(V_Amount,0);
end;

Код Java для выполнения скрипта

private static String runSqlStatement(String script) {
    String status = "";
    System.out.println(script);

    Statement stmt = null;
    try {
        stmt = conn.createStatement();
        stmt.execute(script);

    } catch (SQLException ex) {
        status = ex.getMessage();
        System.err.println("SQLException: " + ex.getMessage());
    } finally {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                System.err.println("SQLException: " + e.getMessage());
            }
        }

    }
    return status;
}

У меня нет установленного Oracle, чтобы проверить мой ответ ... но попробуйте stmt.executeUpdate. Что возвращает эта функция в случае успеха / неудачи?

ygor 17.11.2018 06:56

@ygor, если скрипт выполнить не удалось, это считается успешным выполнением. что столкнулся с проблемой. Я не могу отследить их, если попробую вручную в Oracle (SQL plus), он показывает ошибку.

sreeroop 17.11.2018 07:23

Вы проверяли значение, возвращаемое функцией executeUpdate? Это int. Что дает успех, а что - неудача?

ygor 17.11.2018 07:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что Oracle рассматривает ошибки компиляции при создании процедур как фактические ошибки.

Если вы протестируете это с sqlplus и поставите WHENEVER SQLERROR EXIT FAILURE ROLLBACK, а затем запустите неисправный CREATE OR REPLACE, вы увидите, что обнаруживаются только ошибки, сообщаемые через стандартное сообщение типа ORA-nnnnn. Результат create with compliation errors не распознается как ошибка.

Причина в том, что даже если он создан с ошибками компиляции, он все равно создается.

Единственный способ проверить, удалось ли выполнить CREATE OR REPLACE в вашем варианте использования, возможно, следующим образом:

  1. Выполните оператор CREATE или REPLACE
  2. Отметьте DBA_OBJECTS (или ALL_OBJECTS или USER_OBJECTS в зависимости от ситуации):

SELECT STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME = 'OBject_name' AND OBJECT_TYPE = 'PACKAGE|PACKAGE BODY|PROCEDURE...' AND OWNER = 'the_owner'

Если это возвращает VALID, значит, он работал и скомпилировался чисто, если INVALID, то запросите DBA_ERRORS:

SELECT * FROM DBA_ERRORS WHERE NAME = 'Object_name' AND TYPE = '....' AND OWNER = 'the_owner'

Другие вопросы по теме