1

我有两个过程:一个 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
4

1 回答 1

0

我按照Tolls的建议做了,我把“call P141(?,?)”放入括号中:

"{call P141(?,?)}"

多田!有用。

于 2012-01-06T21:48:38.997 回答