私は、ストアドプロシージャへのJava/JDBC呼び出しをいくつか成功させて開発しています。しかし、出力パラメータが文字列の配列である場合、私は立ち往生しています。私は入力パラメータとしてスカラ型と入力パラメータとして文字列の配列として成功しています。ここでアレイが機能するストアドプロシージャの出力パラメータを取得するにはどうすればよいですか?
は、私が持っているPL/SQLコードです:
TYPE StringArray IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;
create or replace package body
test is
procedure upper(
in_array in StringArray,
out_array out StringArray
) is
tmp StringArray := in_array;
begin
for i in 0..(tmp.count-1) loop
tmp(i) := UPPER(tmp(i));
end loop;
out_array := tmp;
end;
end test;
は、ここで私が持っているJavaコードです:
public void testString(Connection connection) {
String[] values = { "alpha", "beta", "gamma" };
try {
CallableStatement callableStatement = connection.prepareCall("begin test.upper(?, ?); end;");
DelegatingConnection<OracleConnection> delegatingConnection = (DelegatingConnection<OracleConnection>) new DelegatingConnection(connection);
OracleConnection oracleConnection = (OracleConnection) delegatingConnection.getInnermostDelegate();
Array input oracleConnection.createOracleArray("STRINGARRAY", values);
callableStatement.setObject("in_array", input);
callableStatement.registerOutParameter("out_array", Types.ARRAY, "STRINGARRAY");
callableStatement.execute();
Array output = (Array)callableStatement.getObject("out_array");
String[] result = (String[])output.getArray();
System.out.println("Length: " + result.length); // Prints "Length: 3"
System.out.println("First: " + result[0]); // Prints "First: null"
} (catch SQLException e) {
// Handle error
}
}
私はSQLスクリプトからPL/SQLストアドプロシージャを呼び出す場合、直接それが動作します。だから私はストアドプロシージャ自体は大丈夫だと思います。
JDBC経由でストアドプロシージャを呼び出すと、正常に完了します。デバッグステートメントを使用して、values
が正しくJavaクライアントからストアドプロシージャにin_array
に送信されていることを確認しました。つまり、適切な値を持つ長さ3の配列が受け取られます。私が知る限り、がJavaクライアントに返送されます。しかし、何かが間違っています。 result
のサイズは3ですが、すべての要素はnull
です。
output
を調べると、内部では長さがbyte[]
であることがわかります。これらのバイトのサブシーケンスは、「アルファ」、「ベータ」、「ガンマ」に対応しています。したがって、データはクライアントに返されるように見えますが、正しくString[]
に変換されません。
私は間違っていますか?
実際に直面している問題はどこですか。 PLSQLブロックまたはJAVA呼び出し。あなたの質問から明らかではない – XING
@XINGわかりやすいように、ストアドプロシージャが正常に完了するとPL/SQLは大丈夫です。しかし、Javaクライアントコードでは、結果は正しい長さの配列であり、 'null'要素で構成されます。したがって、データはクライアント側で正しく変換されていません。これに基づいて、問題はJavaの終わりにあると思うが、あなたは決して知らない。 – dave
連想配列(インデックスによるテーブル)ではなく、可変配列またはネストしたテーブルを使用することがあります。彼らは[documentation](https://docs.oracle.com/database/121/JJDBC/oraarr.htm#JJDBC28574)に、JDBCドライバがvarrarrayとネストした表をサポートしていると書いています。ドキュメンテーション。 – krokodilko