- PR -

Oracleの配列をjavaで取得時の文字化けを無くしたい

1
投稿者投稿内容
yukiesann
会議室デビュー日: 2002/12/05
投稿数: 8
投稿日時: 2009-03-10 22:45
Oracleの配列をjavaで取得していますが、
取得した文字・数字が全て'???'となってしまいます。
この文字化け無く、データを取得するにはどうしたらよいでしょうか。。

pl/sqlは、SQLPlusで実行し、正常動作を確認しています。
javaコードは、エラーの発生なく動作します。
どうぞよろしくお願いします。

【環境】
Oracle11
Java1.6_12
Tomcat6.0_18
Struts2.0_14
ojdbc6.jar・・・JDBC(ociでもthinでも結果は同じ)


【Oracle側】
/*
* OBJECTタイプの定義
*/
CREATE OR REPLACE TYPE OBJ_SRM_DETAIL AS OBJECT (
TITLE_MAIN VARCHAR2(100),
TITLE_SUB VARCHAR2(100)
);
/

/*
* TABLEタイプの定義
*/
CREATE OR REPLACE TYPE TBL_SRM_DETAIL AS TABLE OF OBJ_SRM_DETAIL;
/

/*
* パッケージ
*/
CREATE OR REPLACE PACKAGE FOR_WEB
IS
PROCEDURE GET_HISTORY_DETAIL_INFO (
inID IN VARCHAR,
REF_CUR IN OUT TBL_SRM_DETAIL);
END FOR_WEB;
/

/*
* パッケージボディ
*/
CREATE OR REPLACE PACKAGE BODY FOR_WEB
IS
PROCEDURE GET_HISTORY_DETAIL_INFO (
inID IN VARCHAR,
REF_CUR IN OUT tbl_srm_detail)
IS
CNT NUMBER(3) := 0;
TYPE CURREF IS REF CURSOR;
MY_CUR CURREF;
TYPE REC_TITLE IS RECORD(
TITLE_MAIN VARCHAR2(100),
TITLE_SUB VARCHAR2(100)
);
MY_REC REC_TITLE;
BEGIN
-- 初期化
SELECT CAST(MULTISET(SELECT MAIN, 'A' FROM TITLE WHERE ID = inID) AS TBL_SRM_DETAIL)
INTO REF_CUR FROM DUAL;

OPEN MY_CUR FOR
SELECT A.NAME, B.NAME
FROM TITLE A
LEFT JOIN TITLE_SUB B ON A.TITLE = B.TITLE
WHERE ID = inID
ORDER BY A.NAME, B.NAME;
LOOP
FETCH MY_CUR INTO MY_REC;
IF MY_CUR%NOTFOUND THEN
EXIT;
END IF;
CNT := CNT + 1;
REF_CUR(CNT).TITLE_MAIN := MY_REC.TITLE_MAIN;
REF_CUR(CNT).TITLE_SUB := MY_REC.TITLE_SUB;
END LOOP;
CLOSE MY_CUR;
END;
END FOR_WEB;
/


【java側】
public DataResult getResult(String patientId) throws SQLException {

DataResult result = new DataResult();

String sqlString = "{call FOR_WEB.GET_HISTORY_DETAIL_INFO(?, ?)}";

Connection con = null;
CallableStatement st = null;
try {
con = ConnectDB.getConnection();
con.setAutoCommit(false);
st = con.prepareCall(sqlString);
st.setString(1, patientId);
st.registerOutParameter(2, OracleTypes.ARRAY, "TBL_SRM_DETAIL");
st.execute();

ARRAY nestedTable = (ARRAY)st.getObject(2);
OracleResultSet rs = (OracleResultSet)nestedTable.getResultSet();
while(rs.next()) {
STRUCT col2Struct = rs.getSTRUCT(2);
Object[] attributes = col2Struct.getAttributes();

//↓"(String)attributes[n]"に、???が入ってしまいます。。。
result.addTitleMain((String)attributes[0]);
result.addTitleSub((String)attributes[1]);
}
rs.close();
rs = null;
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
if(st != null) {
st.close();
}
st = null;
if(con != null) {
con.close();
}
con = null;
}
return result;
}



[ メッセージ編集済み 編集者: yukiesann 編集日時 2009-03-10 23:51 ]

[ メッセージ編集済み 編集者: yukiesann 編集日時 2009-03-11 11:25 ]
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2009-03-11 15:09
ORACLE10g、Java1.5で
以前JDBCが文字化けを起こすという現象に合った事があります。

classes12.jar
nls_charset12.jar

をクラスパスに追加することで解決しました。
今回の件に当てはまるかは分かりませんが参考までに。
ほったて
ベテラン
会議室デビュー日: 2007/11/10
投稿数: 68
投稿日時: 2009-03-11 16:04
データベースのキャラクタセットが SJIS/EUC だったら、JDK1.6 環境には
orai18n.jar が必要になるみたいですね。

http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/java.111/E05720-01/global.htm#CHDCHJJC


※Oracle10g 以降なら nls_charset12.jar は対応してないのでは?
あと classes12.jar は JDK1.3 以前の環境で使用する JDBC ドライバ本体です。


[ メッセージ編集済み 編集者: ほったて 編集日時 2009-03-11 16:07 ]

[ メッセージ編集済み 編集者: ほったて 編集日時 2009-03-11 16:10 ]
yukiesann
会議室デビュー日: 2002/12/05
投稿数: 8
投稿日時: 2009-03-11 19:43
ありがとうございます!
orai18n.jarを追加することで問題を解決することができました。

ただ、インストールしたoracleのディレクトリにあった
orai18n.jarを追加すると、コネクション取得時に
以下のエラーが発生しました。
 【thinドライバ】
 java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOGS.getInstance(I)Loracle/i18n/text/converter/CharacterConverter;

 【ociドライバ】
 java.lang.NoSuchMethodError: oracle.i18n.text.OraBoot.getCharsetMaxCharLen(Ljava/lang/String;)Ljava/lang/String;

調べたところ、jdbcドライバとorai18n.jarのバージョン(?)が
同じでないといけないようでした。
なので、JDBCダウンロードサイトからojdbc6.jar、orai18n.jarの
両方を取得し、使うようにしました。

結果、ociドライバでもthinドライバでも、
文字化けせず、データを取得できました。

本当にありがとうございました。

[ メッセージ編集済み 編集者: yukiesann 編集日時 2009-03-12 00:34 ]
1

スキルアップ/キャリアアップ(JOB@IT)