我得到了以下代码,可以在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文档中发现:
For most extensions in the Oracle Thin driver, you can use the
standard technique as described in Using API Extensions to JDBC
Interfaces. However, the Oracle Thin driver does not provide public
interfaces for its extension methods in the following classes:
oracle.sql.ARRAY
oracle.sql.STRUCT
oracle.sql.REF
oracle.sql.BLOB
oracle.sql.CLOB
WebLogic Server provides its own interfaces to access the extension
methods for those classes:
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);
}
}
}和数字属性映射OK,但是,而不是varchar2属性,我有'???'。
有没有人有类似的问题?
提前致谢。
编辑:我发现在几页信息orai18n.jar应该被添加到服务器类路径。但它对我不起作用。