Jdbc数组绑定:字符集编码

时间:2012-05-03 16:56:20

标签: java oracle jdbc character-encoding

我正在尝试将SQL字符串数组绑定到预准备语句,对于某些数据库字符集,数组的值变为null。如果我绑定简单字符串(不在数组中),它就可以工作。

如果charset(v $ nls_parameters中的NLS_CHARACTERSET)是AL32UTF8,它可以正常工作。如果它是WE8ISO8859P15,那么我能够绑定字符串,但不能绑定字符串数组。差异似乎是Oracle JDBC有specific list of character set支持转换,而ISO-8859-15不属于它们。

这解释了部分问题,因为当它在DB中发现它将所有字符串转换为null时。但是当字符串不在数组中时转换会起作用......所以我很困惑。

我的整个测试如下。我正在使用的表类型定义为create type t_v4000_table as table of varchar2(4000);

Connection connection;

@Before
public void setup() throws SQLException {
    OracleDataSource ds = new OracleDataSource();
    ds.setUser("aaa");
    ds.setPassword("a");
    ds.setURL("jdbc:oracle:thin:@server:1521:orcl");
    connection = ds.getConnection();
}

@Test
// works with both AL32UTF8 and WE8ISO8859P15
public void testScalar() throws SQLException {
    CallableStatement stmt = connection.prepareCall("declare a varchar2(4000) := ?; "
            + "begin if a is null then raise_application_error(-20000,'null'); end if; end;");
    stmt.setString(1, "a");
    stmt.execute();
}

@Test
// works only with AL32UTF8
public void testArray() throws SQLException {
    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("T_V4000_TABLE", connection);
    String[] array = new String[] {"a"};
    Array sqlArray = new ARRAY(descriptor, connection, array);
    CallableStatement stmt = connection.prepareCall("declare a t_v4000_table := ?; " +
            "begin if a(1) is null then raise_application_error(-20000,'null'); end if; end;");
    stmt.setArray(1, sqlArray);
    stmt.execute();
}

我怀疑我在声明和绑定数组的方式上做错了什么,但我找不到什么。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

解决方案,以及对象/集合中字符串与否之间的区别,is well documented,实际上:

  

基本Java Archive(JAR)文件ojdbc5.jar和ojdbc6.jar包含为以下各项提供全面全球化支持的所有必要类:

     
      
  • 未作为Oracle对象或集合类型的数据成员检索或插入的CHAR,VARCHAR,LONGVARCHAR或CLOB数据的Oracle字符集。
  •   
  • 字符集US7ASCII,WE8DEC,WE8ISO8859P1,WE8MSWIN1252和UTF8的对象和集合的CHAR或VARCHAR数据成员。
  •   
     

要在对象或集合的CHAR或VARCHAR数据成员中使用任何其他字符集,必须在应用程序的CLASSPATH环境变量中包含orai18n.jar。

在CLASSPATH中添加orai18n.jar后,它就像魅力一样