sql >> Database >  >> RDS >> Oracle

Hoe schrijf je een java.sql.Array naar een java.sql.SQLOutput binnen SQLData.writeSQL() voor Oracle

Dit is wat ik heb gedaan om dit probleem te omzeilen. Het is niet mooi, maar het werkt.

Ik heb een methode toegevoegd in mijn klas die SQLData implementeert die een java.sql.Connection . ontvangt en stelt de bijbehorende java.sql.ARRAY . in objecten.

Zoiets als dit:

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());
       }
   }

Dat is het eerste deel.

Roep vervolgens, VOORDAT u dat object in een procedure-aanroep gebruikt, setupArrays aan methode op dat object. Voorbeeld:

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;
    }
}

Natuurlijk moet u bij het aansluiten uw typen correct registreren:

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);

Ik hoop dat het helpt.



  1. mysql ... waar de clausule dubbelzinnig is

  2. Bring Your Own Cloud (BYOC) vs. dedicated hosting bij ScaleGrid

  3. schema's gebruiken in postgresql

  4. Hoe upsert correct te doen in postgres 9.5