Ada*_*ter 4 java oracle plsql stored-procedures ora-29532
假设您有一个定义copyFile(String, String)方法的 Java 类:
public class FileSystem {
public static void copyFile(String sourcePath, String destinationPath)
throws IOException
{
// ignore the fact that I'm not properly managing resources...
FileInputStream source = new FileInputStream(sourcePath);
FileOutputStream destination = new FileOutputStream(destinationPath);
copyStream(source, destination);
source.close();
destination.close();
}
private static void copyStream(InputStream source, OutputStream destination)
throws IOException
{
byte[] buffer = new byte[1024];
int length;
while ( (length = source.read(buffer)) != -1 ) {
destination.write(buffer, 0, length);
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设您将其包装在 Java 存储过程中:
CREATE PROCEDURE copy_file (source_path VARCHAR2, destination_path VARCHAR2)
AS LANGUAGE JAVA
NAME 'FileSystem.copyFile(String, String)';
Run Code Online (Sandbox Code Playgroud)
现在假设您调用copy_file存储过程并IOException抛出一个 Java :
BEGIN
copy_file( '/some/file/that/does/not/exist.txt', '/path/to/destination.txt' );
END;
Run Code Online (Sandbox Code Playgroud)
在 PL/SQL 块中,引发的错误是:
ORA-29532 Java 调用被未捕获的 Java 异常终止
错误消息还包含对未捕获的描述Exception,但它仍然是ORA-29532. 有没有办法Exception从 Java 中抛出一个指示 PL/SQL 中引发的错误代码和错误消息的方法?
小智 5
据我所知,Oracle 无法直接捕获 Java 错误。ORA-29532 的 Oracle 文档说明验证了这个想法:
ORA-29532:Java 调用被未捕获的 Java 异常终止:字符串
原因:Java 异常或错误已发出信号且无法由 Java 代码解决。
行动:修改 Java 代码,如果这种行为不是有意的。
根据这段文字,我认为您应该在Java代码中处理异常。
你可以用这些东西来解决这个问题:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 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;
Run Code Online (Sandbox Code Playgroud)