首を突き出して、 TABLE OF varchar(30)INDEX BY VARCHAR(30)
として宣言されたデータ型に直接アクセスする方法はないと言います。 JDBCから。
OracleJDBCドキュメント
連想配列の要素タイプ(つまり、最初の varchar(30)
あなたのタイプで)さまざまな場所で、しかし私が見る限り、それは主要なデータ型について何も述べていません。さらに、ドキュメントには、連想配列が渡され、Java配列として返されることが記載されています。これにより、OracleJDBCはBINARY_INTEGER
の連想配列のみをサポートしているのではないかと思われます。 キーデータ型として。
したがって、 VARCHAR2
を使用してPL/SQL連想配列のデータにアクセスする場合 JDBCからのキーの場合、最初にデータを別のデータ型に変換することをお勧めします。
ただし、作成したJDBCコードは、 BINARY_INTEGER
を使用して連想配列を処理することを期待しています。 キー、 OracleTypes.VARCHAR
を変更すると OracleTypes.NUMERIC
の場合 registerIndexTableOutParameter
の呼び出しで 。返されるJava配列には、最大のキー値と同じ数の要素が含まれることに注意してください。したがって、要素の最大数( registerIndexTableOutParameter
の2番目のパラメーター)を確認してください。 )これには十分な大きさです。また、JDBCドライバーはこれらもサポートしていないように見えるため、連想配列に負のキーまたはゼロのキーがないことを確認してください。
参考までに、<code> INDEX BY BINARY_INTEGERとして宣言された連想配列を取得するために使用したコードを次に示します。 働く。まず、PL / SQLパッケージと本体:
create or replace PACKAGE testLookAside as
type AssocArry IS TABLE OF number INDEX BY binary_integer;
function lookupMasterData return AssocArry;
end testLookAside;
/
create or replace PACKAGE BODY testLookAside as
function lookupMasterData return AssocArry as
retval AssocArry;
begin
retval(2) := 1;
retval(4) := 2;
retval(7) := 3;
retval(1) := 4;
return retval;
end lookupMasterData;
end testLookAside;
/
次に、Javaクラス:
import java.math.BigDecimal;
import java.sql.*;
import java.util.Arrays;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
public class AssocArrayTest {
public static void main(String[] args) throws Exception {
Connection c = DriverManager.getConnection("url", "user", "password");
OracleCallableStatement s = (OracleCallableStatement)c.prepareCall("{? = call testLookAside.lookupMasterData }");
s.registerIndexTableOutParameter(1, 30, OracleTypes.NUMERIC, 0);
s.execute();
BigDecimal[] data = (BigDecimal[])s.getPlsqlIndexTable(1);
System.out.println(Arrays.toString(data));
}
}
Javaクラスを実行すると、次の出力が得られます。
[4, 1, null, 2, null, null, 3]