Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách viết java.sql.Array vào java.sql.SQLOutput trong SQLData.writeSQL () cho Oracle

Đây là những gì tôi đã làm để giải quyết vấn đề này. Nó không đẹp, nhưng nó hoạt động.

Tôi đã thêm một phương thức trong lớp của mình khi triển khai SQLData nhận được một java.sql.Connection và thiết lập java.sql.ARRAY tương ứng đối tượng.

Một cái gì đó như thế này:

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

Đó là phần đầu tiên.

Sau đó, TRƯỚC KHI sử dụng đối tượng đó trong một lệnh gọi thủ tục, hãy gọi setupArrays phương thức trên đối tượng đó. Ví dụ:

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

Tất nhiên, khi kết nối, bạn cần đăng ký đúng loại của mình:

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

Hy vọng nó sẽ hữu ích.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thực hiện một truy vấn thô với trả về trong sqlalchemy

  2. Cơ sở dữ liệu:Hàm Pipelined

  3. REgex để lấy số từ chuỗi trong oracle

  4. Gặp lỗi khi thực thi Stroredprocedure

  5. ORA-00933 Lệnh SQL không được kết thúc đúng cách nhưng tốt trong SQL Developer