QA@IT
«回答へ戻る

回答を投稿

nls_charset12.zipにクラスパスは通っているでしょうか。

通っていないようでしたら、

DBサーバの「{ORACLE_HOME}/jdbc/lib」に配置されていますので、

アプリケーションのライブラリに追加してみてください。

また、JDBCドライバは、上記場所の「classes12.zip」を

使用するのがよいと思います。

nls_charset12.jarと
classes12.jarを
ビルド・パスのライブラリに追加した所、
JAVAからORACLE配列ARRAY arrDataをPL/SQLに渡してINSERTが出来ました^^
ありがとうございます。

しかし、
"111"や"aaa"なら平気なのですが、"あああ"等の日本語をDataArrayに入れると、
UnicodeをOracleキャラクタにマップできません。
と怒られてしまいました。

エラー内容を調べたところ、
「プログラムが、Oracleキャラクタ・セットの文字にマップできないUnicode文字を使用しようとしました。」
とありました。
解決策は、
「無効な文字に対する個別の例外ハンドラを記述するか、またはwithReplacementメソッドをコールして無効な文字を有効な置換文字に置き換えてください」
とありましたが、参考になるHPが見つかりませんでした。。。

一応今のJAVAのソースを手短に置いてみます。

// さきほどの、charSet= CharacterSetUnknownを回避する為にCharacterSetを作りました。
int oracleId = CharacterSet.ASCII_CHARSET;
CharacterSet charset = CharacterSet.make(oracleId);

oracle.sql.CHAR[] DataArray = new CHAR[3];
DataArray[0] = new CHAR("aaa", charset); --これはOK
DataArray[1] = new CHAR("111", charset); --これもOK
DataArray[2] = new CHAR("あああ", charset); ---ここでエラー

try
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(oraurl,orauser,orapass);

// Oracleの配列(コレクション型(VARRAY型))への定義変数作成
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);
ArrayDescriptor intDesc = ArrayDescriptor.createDescriptor("NUMBER_ARRAY", con);

// Oracle配列の作成
ARRAY arrAbs = new ARRAY(intDesc, con, AbsArray);
ARRAY arrRel = new ARRAY(intDesc, con, RelArray);
ARRAY arrFlg = new ARRAY(intDesc, con, FlgArray);
ARRAY arrData = new ARRAY(strDesc, con, DataArray);

// SQL文(ストアドファンクション実行文)の作成
sql = "BEGIN ? := TEST(?, ?, ?, ?); END;";

// ステートメントを作成
cstmt = con.prepareCall(sql);

// パラメータの設定
cstmt.registerOutParameter(1, Types.VARCHAR);
((OracleCallableStatement)cstmt).setARRAY(2, arrAbs);
((OracleCallableStatement)cstmt).setARRAY(3, arrRel);
((OracleCallableStatement)cstmt).setARRAY(4, arrFlg);
((OracleCallableStatement)cstmt).setARRAY(5, arrData);

// ストアードファンクション実行
cstmt.execute();



[ メッセージ編集済み 編集者: satoko 編集日時 2007-05-10 03:54 ]

投稿者:satoko

> nls_charset12.zipにクラスパスは通っているでしょうか。

> 通っていないようでしたら、

> DBサーバの「{ORACLE_HOME}/jdbc/lib」に配置されていますので、

> アプリケーションのライブラリに追加してみてください。

> また、JDBCドライバは、上記場所の「classes12.zip」を

> 使用するのがよいと思います。

> 


nls_charset12.jarと
classes12.jarを
ビルド・パスのライブラリに追加した所、
JAVAからORACLE配列ARRAY arrDataをPL/SQLに渡してINSERTが出来ました^^
ありがとうございます。

しかし、
"111"や"aaa"なら平気なのですが、"あああ"等の日本語をDataArrayに入れると、
UnicodeをOracleキャラクタにマップできません。
と怒られてしまいました。

エラー内容を調べたところ、
「プログラムが、Oracleキャラクタ・セットの文字にマップできないUnicode文字を使用しようとしました。」
とありました。
解決策は、
「無効な文字に対する個別の例外ハンドラを記述するか、またはwithReplacementメソッドをコールして無効な文字を有効な置換文字に置き換えてください」
とありましたが、参考になるHPが見つかりませんでした。。。 

一応今のJAVAのソースを手短に置いてみます。

// さきほどの、charSet= CharacterSetUnknownを回避する為にCharacterSetを作りました。
int oracleId = CharacterSet.ASCII_CHARSET;
CharacterSet charset = CharacterSet.make(oracleId);

oracle.sql.CHAR[] DataArray = new CHAR[3];
DataArray[0] = new CHAR("aaa", charset);    --これはOK
DataArray[1] = new CHAR("111", charset);    --これもOK
DataArray[2] = new CHAR("あああ", charset); ---ここでエラー

try 
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con =  DriverManager.getConnection(oraurl,orauser,orapass);

// Oracleの配列(コレクション型(VARRAY型))への定義変数作成
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);
ArrayDescriptor intDesc = ArrayDescriptor.createDescriptor("NUMBER_ARRAY", con);

// Oracle配列の作成
ARRAY arrAbs = new ARRAY(intDesc, con, AbsArray);
ARRAY arrRel = new ARRAY(intDesc, con, RelArray);
ARRAY arrFlg = new ARRAY(intDesc, con, FlgArray);
ARRAY arrData = new ARRAY(strDesc, con, DataArray);

// SQL文(ストアドファンクション実行文)の作成
sql = "BEGIN ? := TEST(?, ?, ?, ?); END;";

// ステートメントを作成
cstmt = con.prepareCall(sql);

// パラメータの設定
cstmt.registerOutParameter(1, Types.VARCHAR);
((OracleCallableStatement)cstmt).setARRAY(2, arrAbs);
((OracleCallableStatement)cstmt).setARRAY(3, arrRel);
((OracleCallableStatement)cstmt).setARRAY(4, arrFlg);
((OracleCallableStatement)cstmt).setARRAY(5, arrData);

// ストアードファンクション実行
cstmt.execute();
・
・
・
<font size="-1">[ メッセージ編集済み 編集者: satoko 編集日時 2007-05-10 03:54 ]</font>


投稿者:satoko