2012-01-05 9 views
1

静的メソッドO.execute()およびpl/sqlプロシージャにリンクされたJavaストアドプロシージャJAVA_P()SQL_P(in_param IN CUSTOM_TYPE_1、out_param OUT CUSTOM_TYPE_2)。呼び出し可能な文のOUTパラメータから予期しないnullを取得する

JAVA_Pは、CallableStatementを使用してSQL_Pを呼び出します。

そして、大きなWTF: O.execute()をoracle(外部のjvm)の外で実行すると、out_paramが期待通りに設定されます。 O.execute()をJAVA_P()(oracle組み込みのjvmを使用)として実行すると、out_paramはNULLに設定されます(SQL_Pは例外なしで実行され、出力パラメータは設定する必要があります)。

これが起こる理由がありますか?

Oracle Database 10g Enterprise Editionリリース10.2.0.5.0 - 64bi テスト用のJREバージョン1.4.2_04。 JDBCバージョン10.2.0.3.0

@Juergen Hartelt私の英語は明らかにこれを説明するためにenought良くないかもしれませんが、私はこの方法を試します:私はいつものように私のIDEを使用して、いくつかのJavaコードを記述している)

1 :

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)私はこのコードを実行します - うーん! iがP141_JBしたOracle

5)iはP141_JAVABridge.executeを(連結した)に

connection = DriverManager.getConnection("jdbc:default:connection:"); 

4)コンパイル及び負荷クラスに

connection = ods.getConnection(); 

を変更した) 作品

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; 

を実行し、Tollsが私をadviced、私は括弧の中に "コールP141を(、)?" に入れているように私が行っている

((Custom_T_SQLData)call.getObject(2)).responseStatus 
+0

多分、これをデバッグするヒントがありますか? – czajah

+0

"received out_param"とはどういう意味ですか? SQL_P()を呼び出した後、JAVA_Pの内部から値を出力しましたか?または、JAVA_P()の呼び出しの後に戻り値を出力するラッパークラスを作成しましたか? –

+0

@JuergenHartelt私は私の元のポストにいくつかの詳細を入れました – czajah

答えて

0

でNullPointerExceptionが得た:

"{call P141(?,?)}" 

TADA!できます。

関連する問題