我有两个过程:一个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外部运行O.execute()时(从外部jvm)收到out_param设置为预期。 当我以JAVA_P()(使用oracle内置的jvm)运行O.execute()时,out_param设置为null(执行SQL_P时无例外,应设置输出参数)。
你有什么想法会发生这种情况吗?
Oracle数据库10g企业版10.2.0.5.0版 - 64bi 用于测试1.4.2_04的JRE版本。 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