Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die PreparedStatement-Einstellung null für NUMBER_ARRAY funktioniert nicht

Es scheint, dass Sie einige Verwirrung über Null-Arrays, leere Arrays und Arrays haben, die nur einen einzigen NULL enthalten Wert.

Ein NULL array ist das Fehlen eines Arrays, genauso wie ein NULL Zahl ist das Fehlen einer Zahl. Ein leeres Array ist ein Array, das existiert, aber 0 Elemente enthält. Beide unterscheiden sich von NUMBER_ARRAY(null) , bei dem es sich um ein Array handelt, das einen einzelnen NULL enthält Wert.

Der COUNT Methode auf einem Array, die die Anzahl der Elemente im Array zurückgibt, veranschaulicht die Unterschiede zwischen diesen dreien.

Zuerst ein NULL Array:

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

Hier erhalten wir einen Fehler. Wir können nicht herausfinden, wie viele Elemente es in l_null_array gibt weil wir kein Array haben, um die Anzahl der Elemente zu finden.

Zweitens ein leeres 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.

Hier können wir die Anzahl der Elemente in einem leeren Array finden, und diese Zahl ist null.

Schließlich ein Array, das nur NULL enthält :

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.

Dieses Array enthält ein Element, und dieses eine Element ist NULL .

Beachten Sie, dass Sie beliebig viele Argumente an NUMBER_ARRAY übergeben können Konstruktorfunktion, und diese Werte sind die anfänglichen Inhalte des Arrays. Beispiel:NUMBER_ARRAY(1, 4, 18, 11, 22, 6) erstellt ein Zahlenarray mit 6 Elementen darin.

Wie können wir also jede Art von Array mit JDBC festlegen?

  • Um einen NULL zu setzen Array, verwenden Sie

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

    wie Sie es oben getan haben.

  • Verwenden Sie für ein leeres Array:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Für ein Array, das einen einzelnen NULL enthält nur Wert, verwenden Sie

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

Ich verwende eine Integer array in diesen Beispielen, aber andere numerische Typen sollten auch funktionieren.