Я получил следующий код, который отлично работает на OAS10 для извлечения массива пользовательских объектов из процедуры sql:
Connection conn = null;
OracleCallableStatement stmt = null;
RequestsWrapper requestsWrapper = null;
conn = getConnection(DATASOURCE);
if (conn != null) {
stmt = (OracleCallableStatement) conn.prepareCall("{call packageName.procedureName(?, ?, ?)}");
stmt.registerOutParameter(3, OracleTypes.ARRAY, "V_ARRAY_OF_CUSTOM_OBJECTS");
stmt.setString(1, in1);
stmt.setString(2, in2);
stmt.execute();
ARRAY zahtjev = (ARRAY) cs.getArray(3);
RequestsWrapper requestsWrapper = new RequestsWrapper();
for (Object object : (Object[]) zahtjev.getArray()) {
if (object != null) {
CustomObject co = new CustomObject();
Object[] attributes = ((STRUCT) object).getAttributes();
co.setVarcharAttribute((String) attributes[0]);
co.setNumericAttribute(((BigDecimal) attributes[1]).intValue());
requestsWrapper.getObjectList().add(co);
}
}
}
и мне нужно перенести приложение на WLS 10.3.4. Когда я попытался выполнить существующий код, я получил исключение: невозможно привести к oracle.sql.ARRAY. Я нашел в документации WLS:
Для большинства расширений драйвера Oracle Thin можно использовать стандартный метод, описанный в разделе Использование расширений API для интерфейсов JDBC. Однако драйвер Oracle Thin не предоставляет общедоступных интерфейсов для своих методов расширения в следующих классах:
oracle.sql.ARRAY
oracle.sql.STRUCT
oracle.sql.REF
oracle.sql.BLOB oracle.sql.CLOBWebLogic Server предоставляет собственные интерфейсы для доступа к методам расширения для этих классов:
weblogic.jdbc.vendor.oracle.OracleArray weblogic.jdbc.vendor.oracle.OracleStruct weblogic.jdbc.vendor.oracle.OracleRef weblogic.jdbc.vendor.oracle.OracleThinBlob weblogic.jdbc.vendor.oracle.OracleThinClob
Итак, я следовал инструкциям и получил следующий код
Connection conn = null;
OracleCallableStatement stmt = null;
RequestsWrapper requestsWrapper = null;
conn = getConnection(DATASOURCE);
if (conn != null) {
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("V_ARRAY_OF_CUSTOM_OBJECTS", conn);
StructDescriptor structDescriptor = StructDescriptor.createDescriptor("T_CUSTOM_OBJECT", conn);
stmt = (OracleCallableStatement) conn.prepareCall("{call packageName.procedureName(?, ?, ?)}");
stmt.registerOutParameter(3, OracleTypes.ARRAY, "V_ARRAY_OF_CUSTOM_OBJECTS");
stmt.setString(1, in1);
stmt.setString(2, in2);
stmt.execute();
Array request = stmt.getArray(3);
OracleArray requestOracleArray = ((weblogic.jdbc.vendor.oracle.OracleArray)request).getOracleArray();
Datum[] datumArray = ((weblogic.jdbc.vendor.oracle.OracleArray)request).getOracleArray();
RequestsWrapper requestsWrapper = new RequestsWrapper();
for (Datum object : datumArray) {
if (object != null) {
CustomObject co = new CustomObject();
Object[] attributes = ((Struct) object).getAttributes();
co.setVarcharAttribute((String) attributes[0]);
co.setNumericAttribute(((BigDecimal) attributes[1]).intValue());
requestsWrapper.getObjectList().add(co);
}
}
}
и числовой атрибут отображается нормально, но вместо атрибута varchar2 у меня есть «???». У кого-нибудь есть похожая проблема?
Заранее спасибо.
редактировать: я нашел на нескольких страницах информацию о том, что orai18n.jar следует добавить в путь к классам сервера. но у меня это не работает.