sql >> データベース >  >> RDS >> Oracle

plsql-連想配列をJavaに戻す方法

    首を突き出して、 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]
    



    1. 1つのクエリを使用して2つのテーブルからデータを選択する方法

    2. Python db-api:fetchone vs fetchmany vs fetchall

    3. フェイルオーバーを使用してODP.NET接続文字列の接続文字列をどのように構成しますか?

    4. MySQLUPDATEとSELECTを1回のパスで