1

静的メソッドO.execute()にリンクされているJavaストアドプロシージャJAVA_P()とpl / sqlプロシージャSQL_P(in_param IN CUSTOM_TYPE_1、out_param OUT CUSTOM_TYPE_2)の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 10gEnterpriseEditionリリース10.2.0.5.0-テスト1.4.2_04に使用される64biJREバージョン。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)私はこのコードを実行します-wooha!できます

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 に答える