Процедура pl/sql возвращает 3 вопросительных знака ("???") для столбцов varchar2 (wls 10.3.4 - weblogic 11g)

Я получил следующий код, который отлично работает на 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.CLOB

WebLogic 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 следует добавить в путь к классам сервера. но у меня это не работает.


person Kenny    schedule 05.09.2012    source источник


Ответы (2)


в конце orai18n.jar — это решение. мне пришлось включить его в CLASSPATH weblogic, поэтому в папку %MY_DOMAIN%\bin в setDomainEnv.cmd просто добавил

установить CLASSPATH=%WL_HOME%\server\ext\jdbc\oracle\11g\orai18n.jar

и теперь работает :)

person Kenny    schedule 05.09.2012

Иногда это означает, что в ваших полях varchar2 есть элементы юникода. Пожалуйста, подумайте об этом.

person Alexander Tokarev    schedule 05.09.2012
comment
это был первый намек на то, что у меня были специальные символы. Итак, я проверил поля, и теперь поля varchar2 «чисты». внутри только символы a-z и 0-9. - person Kenny; 05.09.2012