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

OracleのSQLData.writeSQL()内でjava.sql.Arrayをjava.sql.SQLOutputに書き込む方法

    この問題を回避するために私がしたことは次のとおりです。きれいではありませんが、機能します。

    SQLDataを実装するメソッドをクラスに追加しました java.sql.Connectionを受け取る 対応するjava.sql.ARRAYを設定します オブジェクト。

    このようなもの:

    public class MyObject01 implements SQLData {
       private String value;
       private MyObject02[] details; // do note that details is a java array
       // ... also added getters and setters for these two properties
    
       private Array detailsArray;
    
       public void setupArrays(oracle.jdbc.OracleConnection oconn)
          throws SQLException
       {
           detailsArrays = oconn.createARRAY(MyObject02.ORACLE_OBJECT_ARRAY_NAME, getDetails());
           // MyObject02.ORACLE_OBJECT_ARRAY_NAME must be the name of the oracle "table of" type name
           // Also note that in Oracle you can't use JDBC's default createArray
           // since it's not supported. That's why you need to get a OracleConnection
           // instance here. 
       }       
    
       @Override
       public void writeSQL(Stream stream) throws SQLException {
           stream.writeString(getValue());
           stream.writeArray(detailsArray); // that's it
       }
    
       @Override
       public void readSQL(Stream stream) throws SQLException {
           setValue(stream.readString());
           Array array = stream.readArray();
           if (array != null) {
               setDetails((MyObject02[])array.getArray());
           }
       }
    

    それが最初の部分です。

    次に、そのオブジェクトをプロシージャコールで使用する前に、setupArraysを呼び出します。 そのオブジェクトのメソッド。例:

    public class DB {
        public static String executeProc(Connection conn, MyObject01 obj)
            throws SQLException
        {
            CalllableStatement cs = conn.prepareCall(" { ? = call sch.proc(?) }");
            cs.registerOutParameter(1, Types.VARCHAR);
            obj.setupArrays((oracle.jdbc.Connection)conn);
            cs.setObject(2, obj, Types.STRUCT);
            cs.executeUpdate();
            String ret = cs.getString(1);
            cs.close();
            return ret;
        }
    }
    

    もちろん、接続時に、タイプを適切に登録する必要があります:

    Connection conn = DriverManager.getConnection("jdbc:oracle://localhost:1521/XE", "scott", "tiger" );
    conn.getTypeMap().put(MyObject01.ORACLE_OBJECT_NAME, MyObject01.class);
    conn.getTypeMap().put(MyObject02.ORACLE_OBJECT_NAME, MyObject02.class);
    conn.getTypeMap().put(MyObject02.ORACLE_OBJECT_ARRAY_NAME, MyObject02[].class);
    

    お役に立てば幸いです。



    1. RubyCSV読み取り複数行フィールド

    2. PHPで16進数を画像に変換しますか?

    3. OracleDatabaseでSETDEFINEOFFを使用する場合または使用する理由

    4. データベースのリストの取得は、選択したサーバーによって異なります