JDBC阵列结合:字符集编码(Jdbc array binding: character set e

2019-09-17 00:47发布

我想一个SQL字符串数组绑定到一个准备好的声明,以及一些数据库字符集,数组的值变为零。 如果我绑定简单的字符串(不是数组),它的工作原理。

如果字符集(NLS_CHARACTERSET在V $ NLS_PARAMETERS)是AL32UTF8,它工作正常。 如果是WE8ISO8859P15,那么我就能绑定字符串,而不是字符串数组。 所不同的似乎是甲骨文JDBC有一个字符集的具体名单有关支持的转换,以及ISO-8859-15是不是其中的一部分。

这解释了问题的一部分,因为当它发现在数据库中,将其转换都为空字符串。 但转换确实当字符串是不是在一个阵列工作...所以我很困惑。

我的整个测试如下。 我使用的表型被定义为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();
}

我怀疑是我做错了什么在我宣布并结合我的数组的方式,但我无法找出什么。 任何想法?

Answer 1:

内部的对象/集合或不串之间的解决方案,以及区别, 是有据可查的 ,实际上是:

基本的Java归档(JAR)文件,ojdbc5.jar和ojdbc6.jar,包含所有必要的类提供完整的国际化支持:

  • Oracle字符集CHAR,VARCHAR,LONGVARCHAR或CLOB数据没有正在检索或插入作为Oracle对象或集合类型的数据成员。
  • 对象和收集用于字符的CHAR或VARCHAR数据成员设置US7ASCII,WE8DEC,WE8ISO8859P1,WE8MSWIN1252,和UTF8。

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

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



文章来源: Jdbc array binding: character set encoding