こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Javaからストアド実行(配列項目)

Javaからストアドを実行しようとしていますが、
単項目のIN、OUTは問題ないのですが
IN引数を配列にしようとした場合うまく処理できません。
ARRAY array = new ARRAY(ad, con, values);のところで
java.sql.SQLException
Non supported character set: oracle-character-set-832
で落ちてしまいます。
原因であると思われた、CLASSPATHにnls_charset12.jarが通っているかということも確認しました。
原因が分かる方がいましたら教えていただきたく思います。
よろしくお願いします。

環境
OS : WindowsXP
DB : Oracle Database 10g Enterprise Edition Release 10.1.0.3.0
JDBC : Oracle JDBC Driver 9.2.0.5
JDK : JDK 1.4.2

----------------------------------------------------------------

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class TestPlsql {

public static void main(String[] args) throws Exception {
String username = "ID";
String password = "PASS";
String thinConn = "jdbc:oracle:thin:@DBADD:1521:DBNAME";

try {
// Oracle JDBC driverをロードします。
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

// DB接続
Connection con = DriverManager.getConnection(thinConn,username,password);

// SQLコンテナ作成
// 引数:IN IN OUT OUT IN OUT
String sql = "{call TEST_PKG.TEST_PRO(?,?,?,?,?,?)}";
OracleCallableStatement cstmt = (OracleCallableStatement)con.prepareCall(sql);

cstmt.setInt( 1, 999 );
cstmt.setString( 2, "TEST" );
cstmt.registerOutParameter( 3, OracleTypes.INTEGER );
cstmt.registerOutParameter( 4, OracleTypes.VARCHAR );

// 配列
String[] values = {"18", "25", "104", "53", "29"};
ArrayDescriptor ad = ArrayDescriptor.createDescriptor("VCHAR2ARRAY", con);
ARRAY array = new ARRAY(ad, con, values); ///////ここでエラー
cstmt.setArray(5, array);
cstmt.registerOutParameter(6, OracleTypes.ARRAY, "VCHAR2ARRAY");

// SQL実行
cstmt.execute();

// OUT引数の値を取得する
System.out.println(cstmt.getInt(3));
System.out.println(cstmt.getString(4));
ARRAY array2 = (ARRAY) cstmt.getArray(6);
String[] s = (String[]) array2.getArray();
for (int i=0; i<s.length; i++) {
System.out.println(s[i]);
}
cstmt.close();
con.close();

} catch (Exception e) {
e.printStackTrace();
}
}

投稿日時 - 2007-11-15 20:07:00

QNo.3521023

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

友人のアカウントから失礼します。質問した者です。
自己解決しましたので報告します。
オラクルのサイトからJDBCを再度ダウンロードしてきて
・classes12.zip
・Nls_charset12.zip
ファイルを差し替えたところ動作しました。

投稿日時 - 2007-11-16 11:06:31

お礼

どうやら当初参照していた
classes12.zipファイルが違うJDBCバージョンのものだったようです。
10.X.X.Xのものだった。

9.2.0.5のものに差し替えることで動作しました。

投稿日時 - 2007-11-16 11:21:48

あなたにオススメの質問