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();
}
}
お礼
ご丁寧な回答ありがとうございました。 当初はつけないというくくりだったため、危ないところでした。 今後ともよろしくお願いいたします。 ありがとうございました。