我有两个过程:一个 java 存储过程 JAVA_P(),它链接到一个静态方法 O.execute() 和一个 pl/sql 过程 SQL_P(in_param IN CUSTOM_TYPE_1, out_param OUT CUSTOM_TYPE_2)。
JAVA_P 使用 CallableStatement 调用 SQL_P。
现在是一个很大的 WTF:当我在 oracle 外部(来自外部 jvm)运行 O.execute() 时,收到的 out_param 已按预期设置。当我将 O.execute() 作为 JAVA_P() 运行(使用 oracle 内置 jvm)时,out_param 设置为 null(SQL_P 无异常执行,并且应设置输出参数)。
你知道为什么会发生这种情况吗?
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 用于测试的 64bi JRE 版本 1.4.2_04。JDBC 版本 10.2.0.3.0
@Juergen Hartelt 我的英语可能不足以清楚地解释这一点,但我会尝试这种方式:
1)我像往常一样使用我的IDE编写了一些java代码:
public class P141_JAVABridge
{
public static void execute()
{
String databaseDriver = "oracle.jdbc.driver.OracleDriver";
String databaseUrl = "jdbc:oracle:thin:@xxx:1521:orcl";
String databaseUsername = "xxx";
String databasePassword = "xxx";
ods.setDriverType(databaseDriver);
ods.setURL(databaseUrl);
ods.setUser(databaseUsername);
ods.setPassword(databasePassword);
connection = ods.getConnection();
.... some code
map.put("custom_T",Custom_T_SQLData.class);
CallableStatement call = connection.prepareCall("call P141(?,?)");
call.setObject(1,inputObjectReference);
call.registerOutParameter(2,OracleTypes.STRUCT,"custom_T");
call.execute();
.... some code
}
}
2)我运行这段代码——哇!有用
3)我变了
connection = ods.getConnection();
至
connection = DriverManager.getConnection("jdbc:default:connection:");
4)编译并加载类到oracle
5) 我已将 P141_JAVABridge.execute() 与 P141_JB
create or replace PROCEDURE P141_JB () IS LANGUAGE JAVA NAME 'x.y.z.P141_JAVABridge.execute()';
6) 然后我执行了 P141_JB
SET SERVEROUTPUT ON;
BEGIN
...some code
P141_JB();
...some code
END;
并得到 NullPointerException
((Custom_T_SQLData)call.getObject(2)).responseStatus