NUMBER_ARRAY的preparedStatement设置为null无效

时间:2015-03-27 20:57:23

标签: java oracle stored-procedures prepared-statement

ArrayDescriptor arrayDescriptor =
    ArrayDescriptor.createDescriptor("NUMBER_ARRAY", conn);

if (parameter != null) {
    ARRAY oracleArray =
            new ARRAY(arrayDescriptor, conn, intList.toArray());
    ps.setArray(i, oracleArray);
} 
else {
    ps.setNull(i, Types.ARRAY, "NUMBER_ARRAY");
}

在上面的代码中,我试图将oracleArray设置为null。它确实不会抛出任何异常。但甲骨文并不认为它是空的。传递null的方法可能是什么,我的意思是将列表设置为null,以便将orcle DB作为NUMBER_ARRAY(null)将其作为后续传递给存储过程(SP)的内容。 SP准备采用空列表。如果是空列表,则不返回任何内容。如果它不是空列表,它将给出结果。这是一个有效的场景。

1 个答案:

答案 0 :(得分:0)

您似乎对空数组,空数组和仅包含单个NULL值的数组感到困惑。

NULL数组缺少数组,就像NULL数字不存在数字一样。空数组是存在的数组,但其中包含0个元素。两者都不同于NUMBER_ARRAY(null),这是一个包含单个NULL值的数组。

数组上的COUNT方法返回数组中元素的数量,说明了这三者之间的差异。

首先,NULL数组:

SQL> declare
  2    l_null_array     number_array  := null;
  3  begin
  4    dbms_output.put_line('Count: ' || l_null_array.COUNT);
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 4

在这里,我们收到错误。我们无法找出l_null_array中有多少元素,因为我们没有数组来查找元素的数量。

其次,一个空数组:

SQL> declare
  2    l_empty_array    number_array  := number_array();
  3  begin
  4    dbms_output.put_line('Count: ' || l_empty_array.COUNT);
  5  end;
  6  /

Count: 0

PL/SQL procedure successfully completed.

在这里,我们可以找到空数组中的元素数,并且该数字为零。

最后,一个只包含NULL的数组:

SQL> declare
  2    l_array_containing_null    number_array  := number_array(null);
  3  begin
  4    dbms_output.put_line('Count: ' || l_array_containing_null.COUNT);
  5  end;
  6  /
Count: 1

PL/SQL procedure successfully completed.

此数组中包含一个元素,并且该元素为NULL

请注意,您可以将任意数量的参数传递给NUMBER_ARRAY构造函数,这些值将是数组的初始内容。例如,NUMBER_ARRAY(1, 4, 18, 11, 22, 6)创建一个包含6个元素的数字数组。

那么,我们如何使用JDBC设置每种类型的数组?

  • 要设置NULL数组,请使用

    ps.setNull(i, Types.ARRAY, "NUMBER_ARRAY");
    

    如上所述。

  • 对于空数组,请使用:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • 对于仅包含单个NULL值的数组,请使用

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[] { null }));
    

我在这些示例中使用了Integer数组,但其他数字类型也应该有用。