sql >> Database >  >> RDS >> Oracle

prepareStatement instelling null voor NUMBER_ARRAY werkt niet

Het lijkt erop dat u enige verwarring heeft over null-arrays, lege arrays en arrays die slechts een enkele NULL bevatten waarde.

Een NULL array is de afwezigheid van een array, op dezelfde manier als een NULL getal is de afwezigheid van een getal. Een lege array is een array die bestaat, maar 0 elementen bevat. Beide zijn verschillend van NUMBER_ARRAY(null) , wat een array is die een enkele NULL . bevat waarde.

De COUNT methode op een array, die het aantal elementen in de array retourneert, geeft een illustratie van de verschillen tussen deze drie.

Ten eerste een NULL reeks:

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 krijgen we een foutmelding. We kunnen niet achterhalen hoeveel elementen er zijn in l_null_array omdat we geen array hebben om het aantal elementen van te vinden.

Ten tweede, een lege 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 kunnen we het aantal elementen in een lege array vinden, en dat aantal is nul.

Eindelijk een array die alleen NULL . bevat :

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.

Deze array bevat één element en dat ene element is NULL .

Merk op dat u zoveel argumenten kunt doorgeven als u wilt aan de NUMBER_ARRAY constructorfunctie, en deze waarden zullen de initiële inhoud van de array zijn. Bijvoorbeeld NUMBER_ARRAY(1, 4, 18, 11, 22, 6) maakt een getallenreeks met 6 elementen erin.

Dus, hoe kunnen we elk type array instellen met JDBC?

  • Een NULL instellen array, gebruik

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

    zoals je hierboven hebt gedaan.

  • Gebruik voor een lege array:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Voor een array met een enkele NULL alleen waarde, gebruik

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

Ik gebruik een Integer array in deze voorbeelden, maar andere numerieke typen zouden ook moeten werken.




  1. Hoe localhost phpmyadmin te verbinden met Android-emulator

  2. Cloud SQL- of VM-instantie om MySQL-database te hosten

  3. Oracle:Java-opgeslagen procedure die JMS-bericht verzendt

  4. SQL selecteer max(datum) en bijbehorende waarde