- - PR -
Oracleの配列をjavaで取得時の文字化けを無くしたい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ] |
|
投稿日時: 2009-03-11 15:09
ORACLE10g、Java1.5で
以前JDBCが文字化けを起こすという現象に合った事があります。 classes12.jar nls_charset12.jar をクラスパスに追加することで解決しました。 今回の件に当てはまるかは分かりませんが参考までに。 |
|
投稿日時: 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 ] |
|
投稿日時: 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