Я делаю простой инструмент (использую), который выполняет сценарий 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;
}
@ygor, если скрипт выполнить не удалось, это считается успешным выполнением. что столкнулся с проблемой. Я не могу отследить их, если попробую вручную в Oracle (SQL plus), он показывает ошибку.
Вы проверяли значение, возвращаемое функцией executeUpdate? Это int. Что дает успех, а что - неудача?




Я не думаю, что Oracle рассматривает ошибки компиляции при создании процедур как фактические ошибки.
Если вы протестируете это с sqlplus и поставите WHENEVER SQLERROR EXIT FAILURE ROLLBACK, а затем запустите неисправный CREATE OR REPLACE, вы увидите, что обнаруживаются только ошибки, сообщаемые через стандартное сообщение типа ORA-nnnnn. Результат create with compliation errors не распознается как ошибка.
Причина в том, что даже если он создан с ошибками компиляции, он все равно создается.
Единственный способ проверить, удалось ли выполнить CREATE OR REPLACE в вашем варианте использования, возможно, следующим образом:
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'
У меня нет установленного Oracle, чтобы проверить мой ответ ... но попробуйте
stmt.executeUpdate. Что возвращает эта функция в случае успеха / неудачи?