sql >> Databasteknik >  >> RDS >> Oracle

readyStatement-inställningen null för NUMBER_ARRAY fungerar inte

Det verkar som om du har en viss förvirring angående null-arrayer, tomma arrayer och arrayer som bara innehåller en enda NULL värde.

En NULL array är frånvaron av en array, på samma sätt som en NULL nummer är frånvaron av ett nummer. En tom array är en array som finns, men som har 0 element i sig. Båda skiljer sig från NUMBER_ARRAY(null) , som är en array som innehåller en enda NULL värde.

COUNT metod på en array, som returnerar antalet element i arrayen, ger en illustration av skillnaderna mellan dessa tre.

Först en 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

Här får vi ett fel. Vi kan inte ta reda på hur många element det finns i l_null_array eftersom vi inte har en array att hitta antalet element i.

För det andra, en tom 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.

Här kan vi hitta antalet element i en tom array, och det numret är noll.

Slutligen en array som endast innehåller 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.

Denna array har ett element inom sig, och det ena elementet är NULL .

Observera att du kan skicka så många argument som du vill till NUMBER_ARRAY konstruktorfunktion, och dessa värden kommer att vara det initiala innehållet i arrayen. Till exempel, NUMBER_ARRAY(1, 4, 18, 11, 22, 6) skapar en nummermatris med 6 element i den.

Så, hur kan vi ställa in varje typ av array med JDBC?

  • För att ställa in en NULL array, använd

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

    som du har gjort ovan.

  • För en tom array, använd:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • För en array som innehåller en enda NULL endast värde, använd

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

Jag använder ett Integer array i dessa exempel, men andra numeriska typer bör också fungera.




  1. Hur FROM_BASE64() fungerar i MariaDB

  2. Infoga i tabellen med hjälp av For In Range och nycklar för värdet

  3. använd IFNULL i laravel

  4. Ändra år i mysql date