Đâ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.