繁体   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)

我得到以下代码在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驱动程序中的大多数扩展,您可以使用标准技术,如使用JDBC扩展到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应添加到服务器类路径的信息。 但它对我不起作用。

最后,orai18n.jar是解决方案。 我必须将它包含在weblogic的CLASSPATH中,所以在setDomainEnv.cmd的%MY_DOMAIN%\\ bin文件夹中添加

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

现在它的工作原理:)

有时它意味着你的varchar2字段中有unicode东西。 请考虑一下。

暂无
暂无

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

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