静的メソッド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
多分、これをデバッグするヒントがありますか? – czajah
"received out_param"とはどういう意味ですか? SQL_P()を呼び出した後、JAVA_Pの内部から値を出力しましたか?または、JAVA_P()の呼び出しの後に戻り値を出力するラッパークラスを作成しましたか? –
@JuergenHartelt私は私の元のポストにいくつかの詳細を入れました – czajah