简体   繁体   English

pl / sql过程为varchar2列返回3个问号('???')(wls 10.3.4 - weblogic 11g)

[英]pl/sql procedure returns 3 question marks ('???') for varchar2 columns (wls 10.3.4 - weblogic 11g)

I got the following code that works fine on OAS10, for fetching array of custom object from sql procedure: 我得到以下代码在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);
       }
    }
}

and I have to migrate application to WLS 10.3.4. 我必须将应用程序迁移到WLS 10.3.4。 When I tried to execute existing code, I got an exception: cannot cast to oracle.sql.ARRAY. 当我尝试执行现有代码时,我遇到了一个异常:无法转换为oracle.sql.ARRAY。 I found in WLS documentation: 我在WLS文档中找到了:

For most extensions in the Oracle Thin driver, you can use the standard technique as described in Using API Extensions to JDBC Interfaces. 对于Oracle Thin驱动程序中的大多数扩展,您可以使用标准技术,如使用JDBC扩展到JDBC接口中所述。 However, the Oracle Thin driver does not provide public interfaces for its extension methods in the following classes: 但是,Oracle Thin驱动程序不为以下类中的扩展方法提供公共接口:

oracle.sql.ARRAY oracle.sql.ARRAY
oracle.sql.STRUCT oracle.sql.STRUCT
oracle.sql.REF oracle.sql.REF
oracle.sql.BLOB oracle.sql.CLOB oracle.sql.BLOB oracle.sql.CLOB

WebLogic Server provides its own interfaces to access the extension methods for those classes: 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 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

So, I followed the instructions and I got following code 所以,我按照说明操作,我得到了以下代码

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

and numeric attribute is mapped OK, but instead of varchar2 attribute, I have '???'. 和数字属性映射正常,但我有'???'而不是varchar2属性。 Does anyone have similar problem? 有没有人有类似的问题?

Thanks in advance. 提前致谢。

edit: i found on few pages info that orai18n.jar should be added to server classpath. 编辑:我在几页信息中找到orai18n.jar应添加到服务器类路径的信息。 but it doesn't work for me. 但它对我不起作用。

at the end, orai18n.jar is solution. 最后,orai18n.jar是解决方案。 i had to include it in CLASSPATH of weblogic, so in %MY_DOMAIN%\\bin folder in setDomainEnv.cmd just added 我必须将它包含在weblogic的CLASSPATH中,所以在setDomainEnv.cmd的%MY_DOMAIN%\\ bin文件夹中添加

set CLASSPATH=%WL_HOME%\\server\\ext\\jdbc\\oracle\\11g\\orai18n.jar 设置CLASSPATH =%WL_HOME%\\ server \\ ext \\ jdbc \\ oracle \\ 11g \\ orai18n.jar

and now it works :) 现在它的工作原理:)

Sometimes it means you have unicode stuff in your varchar2 fields. 有时它意味着你的varchar2字段中有unicode东西。 Please consider about it. 请考虑一下。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM