sql >> Base de Datos >  >> RDS >> Oracle

la configuración de la declaración preparada nula para NUMBER_ARRAY no funciona

Parece que tiene cierta confusión acerca de las matrices nulas, las matrices vacías y las matrices que contienen solo un único NULL valor.

Un NULL matriz es la ausencia de una matriz, de la misma manera que un NULL número es la ausencia de un número. Una matriz vacía es una matriz que existe, pero tiene 0 elementos. Ambos son diferentes de NUMBER_ARRAY(null) , que es una matriz que contiene un solo NULL valor.

El COUNT en una matriz, que devuelve el número de elementos de la matriz, proporciona una ilustración de las diferencias entre estos tres.

En primer lugar, un NULL matriz:

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

Aquí, obtenemos un error. No podemos averiguar cuántos elementos hay en l_null_array porque no tenemos una matriz para encontrar el número de elementos.

En segundo lugar, una matriz vacía:

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.

Aquí, podemos encontrar el número de elementos en una matriz vacía, y ese número es cero.

Finalmente, una matriz que contiene solo 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.

Esta matriz tiene un elemento dentro, y ese elemento es NULL .

Tenga en cuenta que puede pasar tantos argumentos como desee al NUMBER_ARRAY función constructora, y estos valores serán los contenidos iniciales de la matriz. Por ejemplo, NUMBER_ARRAY(1, 4, 18, 11, 22, 6) crea una matriz de números con 6 elementos.

Entonces, ¿cómo podemos configurar cada tipo de arreglo usando JDBC?

  • Para establecer un NULL matriz, uso

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

    como lo ha hecho anteriormente.

  • Para una matriz vacía, use:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Para una matriz que contiene un solo NULL solo valor, use

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

Estoy usando un Integer matriz en estos ejemplos, pero otros tipos numéricos también deberían funcionar.