Как я знаю, Oracle не может напрямую отлавливать ошибки Java. И примечание к документации Oracle ORA-29532 подтверждает эту идею:
ORA-29532: Вызов Java завершен из-за неперехваченного исключения Java: строка
Причина: об исключении или ошибке Java было сообщено и не может быть разрешено кодом Java.
Действие: измените код Java, если это поведение не предусмотрено.
Согласно этому тексту, я думаю, вы должны обработать исключение в коде Java.
Вы можете решить это с помощью этих вещей:
- Возвращаемое значение функции Java может быть String - не void, и вы можете отправить описание ошибки в возвращаемой переменной.
- Вы можете сохранить ошибку в таблице Oracle в коде Java и прочитать ее в коде PL / SQL.
- Вы просто отправляете ошибку в файл дампа пользователя Oracle с
System.out.println();
.
Редактировать: окончательное решение Адама
Это примерно то, что я реализовал, основываясь на ответе:
package mypackage;
public class MyClass {
public static final int SUCCESS = 1;
public static final int FAILURE = 0;
/**
* This method actually performs the business logic.
*/
public static void doSomething(String arg1, String arg2) throws SQLException {
// Actually do something...
}
/**
* This method is called from PL/SQL.
*/
public static int doSomething(String arg1, String arg2, int[] errorCode, String[] errorMessage) {
try {
doSomething(arg1, arg2);
return success();
} catch (SQLException e) {
return failure(e, errorCode, errorMessage);
}
}
private static int success() {
return SUCCESS;
}
private static int failure(SQLException e, int[] errorCode, String[] errorMessage) {
errorCode[0] = e.getErrorCode();
errorMessage[0] = e.getMessage();
return FAILURE;
}
}
Затем в PL / SQL:
SUCCESS CONSTANT BINARY_INTEGER := 1;
FAILURE CONSTANT BINARY_INTEGER := 0;
SUBTYPE error_code_type IS BINARY_INTEGER;
SUBTYPE error_message_type IS VARCHAR2(1000);
PROCEDURE
raise_error_if_failure
(
status BINARY_INTEGER,
error_code ERROR_CODE_TYPE,
error_message ERROR_MESSAGE_TYPE
)
IS
BEGIN
IF status = FAILURE THEN
raise_application_error(error_code, error_message);
END IF;
END;
FUNCTION
do_something_in_java
(
arg1 VARCHAR2,
arg2 VARCHAR2,
error_code OUT ERROR_CODE_TYPE,
error_message OUT ERROR_MESSAGE_TYPE
)
RETURN BINARY_INTEGER
AS LANGUAGE JAVA
NAME 'mypackage.MyClass.doSomething(java.lang.String, java.lang.String, int[], java.lang.String[]) return int';
PROCEDURE
do_something
(
arg1 VARCHAR2,
arg2 VARCHAR2
)
IS
error_code ERROR_CODE_TYPE;
error_message ERROR_MESSAGE_TYPE;
BEGIN
raise_error_if_failure(
do_something_in_java(arg1, arg2, error_code, error_message),
error_code,
error_message
);
END;