从可调用语句OUT参数中检索意外的null

时间:2012-01-05 18:18:44

标签: java oracle jdbc oracle10g java-stored-procedures

我有两个过程:一个ja​​va存储过程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

1 个答案:

答案 0 :(得分:0)

我已经完成了Tolls建议我,我已经把“打电话给P141(?,?)”括起来:

"{call P141(?,?)}"

TADA!它有效。