3

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.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をサーバーのクラスパスに追加する必要があるという情報が見つかりました。しかし、それは私にはうまくいきません。

4

2 に答える 2

8

最後に、orai18n.jarがソリューションです。weblogicのCLASSPATHに含める必要があったため、setDomainEnv.cmdの%MY_DOMAIN%\binフォルダーに追加しました

CLASSPATH =%WL_HOME%\ server \ ext \ jdbc \ oracle \ 11g\orai18n.jarを設定します

そして今それは動作します:)

于 2012-09-05T14:42:45.213 に答える
0

時々それはあなたがあなたのvarchar2フィールドにユニコードのものを持っていることを意味します。ぜひご検討ください。

于 2012-09-05T14:20:30.737 に答える