答えはすでにここで答えられています: how to call procedure with out parameter as table type from a Java class
しかし、戻り値のコードが常に "???" であるという問題があり、trxSeq の値は正しく返されます。db で直接呼び出すと、コードに値が入力されます。
タイプ varchar2、char、varchar としてコードを試しました。変わりはない。
desc t_mam_code:
TYPE t_mam_code AS OBJECT(
code VARCHAR2(30),
trxSeq NUMBER(12)
Java メソッド
final String typeName = "T_MAM_CODE";
final String typeTableName = "T_MAM_CODE_TAB";
// no difference, if we use Oracle Connection or java.sql.Connection
OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);
// Get a description of your type (Oracle specific)
final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName, oracleConnection);
final ResultSetMetaData metaData = structDescriptor.getMetaData();
CallableStatement call = oracleConnection.prepareCall("{call business.getCodes(?, ?, ?, ?, ?, ?, ?)}");
// CallableStatement call = connection.prepareCall("{call business.getCodes(?, ?, ?, ?, ?, ?, ?)}");
int i = 1;
call.setString(i++, shopId);
call.setDate(i++, new java.sql.Date(consumerStamp.getTime()));
call.setInt(i++, version);
...
int out1 = i++;
call.registerOutParameter(out1, Types.ARRAY, typeTableName);
//call.registerOutParameter(out1, OracleTypes.ARRAY, typeTableName);
call.execute();
Object[] data = (Object[]) ((Array) call.getObject(out1)).getArray();
for(Object tmp : data) {
Struct row = (Struct) tmp;
// Attributes are index 1 based...
int idx = 1;
for(Object attribute : row.getAttributes()) {
System.out.println(metaData.getColumnName(idx) + " " + attribute);
++idx;
}
出力は次のとおりです。
CODE ???
TRXSEQ 200001520606 ...
出力は次のようになります。
CODE ABC1234
TRXSEQ 200001520606
Java 1.6、Oracle 11g、ドライバー ojdbc6-11.2.0.3.0.jar を hibernate 4.1.12 で使用します。