Saturday, February 12, 2005

Java: Oracle Collection Object

Ini pengalaman partner saya. Dia bikin oracle object seperti ini:

CREATE OR REPLACE
TYPE T_SOMETHING AS OBJECT
(
PK_SOMETHING NUMBER,
SOMETHING VARCHAR2(10)
);
/

Kemudian dia bikin collection dari object tersebut:

CREATE OR REPLACE
TYPE "T_COLL_SOMTHING" AS TABLE OF T_SOMETHING;
/

Collection object tersebut digunakan sebagai return dari sebuah oracle function

CREATE OR REPLACE FUNCTION GET_SOMETHING(a_date DATE)
RETURN T_COLL_SOMTHING
IS
...
...
...dihapus...

Yang membuat pusing adalah, di develompent server (embedded WAS di WSAD 5.1.0/JRE1.3) code java dibawah ini menghasilkan nilai hexadesimal.

CallableStatement cs = conn.prepareCall("BEGIN ? := get_something( ? ); END;");
cs.registerOutParameter(1, Types.ARRAY, "T_COLL_SOMTHING");
cs.setDate(2, currDate);
cs.execute();

Array res = cs.getArray(1);
rs = res.getResultSet();

while (rs.next()){
java.sql.Struct struct = (java.sql.Struct)rs.getObject(2);
Object[] objectArray = struct.getAttributes();
String s = (String)objectArray[1];
System.out.print(s);
}

Jika varibel string "s" dikonversi dari hexa ke kode ascii, didapatkan hasil yang diinginkan.

URL dari google ini http://forums.oracle.com/forums/thread.jsp?forum=99&thread=228159&message=640498
menyarankan untuk menambahkan nls_ charset12.zip di classpath.

Tapi tampaknya nls_ charset12.zip tidak memecahkan masalah. Di production server (WAS 5.1/JRE 1.4.2 dengan menggunakan embedded data source) menghasilkan karakater "???"

Saya coba seperti ini :
     oracle.sql.STRUCT struct = (oracle.sql.STRUCT)rs.getObject(2);
Datum[] objectArray = struct.getOracleAttributes();
String s = ((oracle.sql.CHAR)objectArray[1]).getString();
System.out.print(s);
hasilnya adalah
java.sql.SQLException : Non supported character set: oracle-character-set-178
Bagaimana ini?

No comments:

Followers