[英]Inconsistent string length definition between Java String.substring() and Oracle 11g column VARCHAR2 size
[英]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.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應添加到服務器類路徑的信息。 但它對我不起作用。
最后,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.