Java 为数字数组设置null的preparedStatement无效

Java 为数字数组设置null的preparedStatement无效,java,oracle,stored-procedures,prepared-statement,Java,Oracle,Stored Procedures,Prepared Statement,在上面的代码中,我试图将oracleArray设置为null。它不会抛出任何异常。但我想甲骨文并不认为它是空的。传入null的方法是什么?我的意思是将列表设置为null,orcle DB可以将其视为NUMBER\u ARRAY(null),稍后将其传递给存储过程(SP)。SP已准备好接受空列表。如果是空列表,则不返回任何内容。如果不是空列表,它将给出结果。这是一个有效的场景。对于空数组、空数组和只包含单个null值的数组,您似乎有些混淆 NULL数组表示没有数组,正如NULL数字表示没有数字一样

在上面的代码中,我试图将
oracleArray
设置为null。它不会抛出任何异常。但我想甲骨文并不认为它是空的。传入null的方法是什么?我的意思是将列表设置为null,orcle DB可以将其视为
NUMBER\u ARRAY(null)
,稍后将其传递给存储过程(SP)。SP已准备好接受空列表。如果是空列表,则不返回任何内容。如果不是空列表,它将给出结果。这是一个有效的场景。

对于空数组、空数组和只包含单个
null
值的数组,您似乎有些混淆

NULL
数组表示没有数组,正如
NULL
数字表示没有数字一样。空数组是存在的数组,但其中包含0个元素。两者都不同于
NUMBER\u数组(null)
,后者是一个包含单个
null
值的数组

数组上的
COUNT
方法返回数组中的元素数,说明了这三种方法之间的区别

首先,一个
NULL
数组:

SQL>declare
2 l_null_数组数_数组:=null;
3开始
4 dbms_output.put_line('Count:'| | l_null_array.Count);
5结束;
6  /
声明
*
第1行错误:
ORA-06531:对未初始化集合的引用
ORA-06512:在第4行
这里,我们得到一个错误。我们无法找出
l\u null\u数组中有多少个元素,因为我们没有一个数组来查找元素的数量

第二,空数组:

SQL>declare
2 l_空_数组数_数组:=数_数组();
3开始
4 dbms_输出.put_行('Count:'| | l_empty_array.Count);
5结束;
6  /
计数:0
PL/SQL过程已成功完成。
在这里,我们可以找到一个空数组中的元素数,这个数是零

最后,一个数组只包含
NULL

SQL>declare
2 l_数组包含_null number_数组:=number_数组(null);
3开始
4 dbms_output.put_line('Count:'| | l_array_包含_null.Count);
5结束;
6  /
计数:1
PL/SQL过程已成功完成。
此数组中有一个元素,该元素为
NULL

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

那么,我们如何使用JDBC设置每种数组呢

  • 要设置
    NULL
    数组,请使用

    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");
    }
    
    正如你在上面所做的

  • 对于空数组,请使用:

    ps.setNull(i, Types.ARRAY, "NUMBER_ARRAY");
    
  • 对于仅包含单个
    NULL
    值的数组,请使用

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    

在这些示例中,我使用的是一个
整数
数组,但其他数值类型也可以。

您希望数据库中的Oracle集合本身为null,还是一个元素的集合,其中该元素为null?基本上,我希望Oracle将我的参数作为数字数组(null).我想将一个空列表从java传递到oracle存储过程,该过程应将其作为数字数组(空)。。我已经通过传入NUMBER_数组(null)来运行存储过程,并且工作正常。但当从java调用SP时,传入空列表不起作用。我知道我们可以将int设置为null作为ps.setNull(I,int),但不确定如何从java中处理BigInteger列表。对于您的问题,我希望oracle集合本身为空@rgettman@Raj你在自相矛盾。你说如果你传递你存储的proc
NUMBER\u数组(null)
它可以正常工作,但是你也说“你希望你的集合本身为null”
NUMBER\u数组(null)
不是null集合,它是一个包含单个
null
值的单元素集合。请澄清你到底想要什么。@LukeWoodward:对不起,我的声明。我没有意识到NUMBER_数组(null)相当于包含单个null的集合的1个元素。我这里的问题是我想传入一个没有添加值的列表。所以我的理解是,我需要传入一个1元素为null的列表,以使该场景正常工作。谢谢您的回答。对不起,我没能向你解释我的问题。我使用的是列表中从未初始化的场景。所以我的场景是指你的第一个场景。不管怎样,我需要把所有这些选择都告诉DB的家伙,并找出他喜欢的方式。
ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[] { null }));