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

Oracleでoutパラメータとしてテーブルを取得する方法

    これをマップするには、sqldataオブジェクトを定義する必要があります。

    ドキュメント: http://docs.oracle.com /cd/E11882_01/java.112/e16548/oraarr.htm#JJDBC28574

    例:

    SQL> create or replace TYPE tableOneExample AS OBJECT (
      2        somethingOne                 VARCHAR2 (4)
      3       ,somethingTwo        NUMBER (12)
      4  );
      5  /
    
    Type created.
    
    SQL> create or replace TYPE outputOneSQLType IS TABLE OF tableOneExample;
      2  /
    
    Type created.
    
    SQL>
    SQL> create or replace PROCEDURE myprocedure (
      2  inputParam                IN       VARCHAR2,
      3  outputOne                 OUT outputOneSQLType)
      4  as
      5  begin
      6  outputOne  := outputOneSQLType(tableOneExample('a', 1), tableOneExample('b', 2));
      7  end;
      8  /
    
    Procedure created.
    

    次に、SQLDATAインターフェイスを定義します。

    import java.sql.*;
    
    public class TestArr implements SQLData
     {
      private String sql_type;
    
      public String attrOne;
      public int    attrTwo;
    
      public TestArr() 
      { 
      }
      public TestArr (String sql_type, String attrOne, int attrTwo)
      {
        this.sql_type = sql_type;
        this.attrOne = attrOne;
        this.attrTwo = attrTwo;
       }
    
      // define a get method to return the SQL type of the object
      public String getSQLTypeName() throws SQLException
      { 
        return sql_type; 
      } 
    
      // define the required readSQL() method 
      public void readSQL(SQLInput stream, String typeName)
        throws SQLException
      {
        sql_type = typeName;
    
        attrOne = stream.readString();
        attrTwo = stream.readInt();
      }  
      // define the required writeSQL() method 
      public void writeSQL(SQLOutput stream)
        throws SQLException
      { 
        stream.writeString(attrOne);
        stream.writeInt(attrTwo);
      }
    }
    

    ストリームの書き込み/読み取りの入力と順序がOracleタイプと同じであることを確認してください。不整合があると、内部表現エラーが発生します。

    次に、メインクラスで、これを次のようにマップします。

    CallableStatement stmt = conn.prepareCall("begin myprocedure(?,?); end;");
    stmt.setString(1, "foo");
    stmt.registerOutParameter(2, java.sql.Types.ARRAY, "OUTPUTONESQLTYPE"); // YOUR ARRAY TYPE (TO MATCH THE API OUTPUT), NOT OBJECT
    stmt.execute();
    Array arr = stmt.getArray (2);
    Map map = conn.getTypeMap();
    map.put("TABLEONEEXAMPLE", Class.forName("TestArr")); // YOUR OBJECT TYPE, NOT ARRAY.
    Object[] values = (Object[]) arr.getArray();
    for (int i=0; i < values.length; i++)
    {
      TestArr a = (TestArr)values[i];
      System.out.println("somethingOne: " + a.attrOne);
      System.out.println("somethingTwo: " + a.attrTwo);
    }
    

    結果ビエン:

    M:\Documents\Sample Code\1>javac TestArr.java
    
    M:\Documents\Sample Code\1>javac ArrayTest.java
    Note: ArrayTest.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    
    M:\Documents\Sample Code\SQLComplexArray>java ArrayTest
    Opening Oracle connection...done.
    somethingOne: a
    somethingTwo: 1
    somethingOne: b
    somethingTwo: 2
    



    1. FIFOを介して完全にMySQLクライアントに接続します

    2. SQL Server 対称キー暗号化を解読できるユーザーを制御する方法

    3. Mybatis移行ツールで1つのトランザクションで複数のmysqlステートメントを実行する

    4. 複数のタグを持つ行を選択してください...より良い方法はありますか?