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准备采用空列表。如果是空列表,则不返回任何内容。如果它不是空列表,它将给出结果。这是一个有效的场景。
答案 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
数组,但其他数字类型也应该有用。