Как проверить правильность создания процедуры Oracle с помощью Java? - PullRequest
0 голосов
/ 17 ноября 2018

Я делаю простой инструмент (используя), который выполняет сценарий 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;
}

1 Ответ

0 голосов
/ 17 ноября 2018

Я не думаю, что 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'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...