Oracle
 sql >> Database >  >> RDS >> Oracle

L'impostazione di fixedStatement null per NUMBER_ARRAY non funziona

Sembra che tu abbia una certa confusione su array nulli, array vuoti e array che contengono solo un singolo NULL valore.

Un NULL array è l'assenza di un array, allo stesso modo di un NULL numero è l'assenza di un numero. Un array vuoto è un array che esiste, ma contiene 0 elementi. Entrambi sono diversi da NUMBER_ARRAY(null) , che è un array che contiene un singolo NULL valore.

Il COUNT metodo su un array, che restituisce il numero di elementi nell'array, fornisce un'illustrazione delle differenze tra questi tre.

Innanzitutto, un NULL matrice:

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

Qui, otteniamo un errore. Non possiamo scoprire quanti elementi ci sono in l_null_array perché non abbiamo un array di cui trovare il numero di elementi.

In secondo luogo, un array vuoto:

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.

Qui possiamo trovare il numero di elementi in un array vuoto e quel numero è zero.

Infine, un array contenente 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.

Questo array ha un elemento al suo interno e quell'elemento è NULL .

Nota che puoi passare tutti gli argomenti che vuoi al NUMBER_ARRAY funzione di costruzione e questi valori saranno il contenuto iniziale dell'array. Ad esempio, NUMBER_ARRAY(1, 4, 18, 11, 22, 6) crea una matrice di numeri con 6 elementi al suo interno.

Quindi, come possiamo impostare ogni tipo di array usando JDBC?

  • Per impostare un NULL matrice, usa

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

    come hai fatto sopra.

  • Per un array vuoto, usa:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Per un array contenente un singolo NULL solo valore, utilizzare

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

Sto usando un Integer array in questi esempi, ma dovrebbero funzionare anche altri tipi numerici.