SQLプロシージャからカスタムオブジェクトの配列をフェッチするために、OAS10で正常に機能する次のコードを取得しました。
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);
}
}
}
アプリケーションをWLS10.3.4に移行する必要があります。既存のコードを実行しようとすると、例外が発生しました。oracle.sql.ARRAYにキャストできません。私はWLSのドキュメントで見つけました:
Oracle Thinドライバのほとんどの拡張機能では、「JDBCインターフェイスへのAPI拡張機能の使用」で説明されている標準的な手法を使用できます。ただし、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をサーバーのクラスパスに追加する必要があるという情報が見つかりました。しかし、それは私にはうまくいきません。