Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

A configuração de prepareStatement nula para NUMBER_ARRAY não funciona


Parece que você tem alguma confusão sobre matrizes nulas, matrizes vazias e matrizes que contêm apenas um único NULL valor.

Um NULL array é a ausência de um array, da mesma forma que um NULL número é a ausência de um número. Um array vazio é um array que existe, mas contém 0 elementos. Ambos são diferentes de NUMBER_ARRAY(null) , que é uma matriz que contém um único NULL valor.

O COUNT O método em uma matriz, que retorna o número de elementos na matriz, fornece uma ilustração das diferenças entre esses três.

Em primeiro lugar, um NULL variedade:
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

Aqui, temos um erro. Não conseguimos descobrir quantos elementos existem em l_null_array porque não temos uma matriz para encontrar o número de elementos.

Em segundo lugar, uma matriz vazia:
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.

Aqui, podemos encontrar o número de elementos em uma matriz vazia, e esse número é zero.

Finalmente, um array contendo apenas 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 tem um elemento dentro dela, e esse elemento é NULL .

Observe que você pode passar quantos argumentos quiser para o NUMBER_ARRAY função construtora, e esses valores serão o conteúdo inicial da matriz. Por exemplo, NUMBER_ARRAY(1, 4, 18, 11, 22, 6) cria uma matriz numérica com 6 elementos.

Então, como podemos definir cada tipo de array usando JDBC?

  • Para definir um NULL matriz, usar
    ps.setNull(i, Types.ARRAY, "NUMBER_ARRAY");
    

    como você fez acima.

  • Para uma matriz vazia, use:
    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    

  • Para um array contendo um único NULL valor apenas, use
    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[] { null }));
    

Estou usando um Integer array nesses exemplos, mas outros tipos numéricos também devem funcionar.