sql >> Databáze >  >> RDS >> Oracle

PrepareStatement nastavení null pro NUMBER_ARRAY nefunguje

Zdá se, že máte nějaké nejasnosti ohledně nulových polí, prázdných polí a polí, která obsahují pouze jeden NULL hodnotu.

A NULL pole je nepřítomnost pole, stejným způsobem jako NULL číslo je absence čísla. Prázdné pole je pole, které existuje, ale obsahuje 0 prvků. Oba se liší od NUMBER_ARRAY(null) , což je pole, které obsahuje jeden NULL hodnotu.

COUNT metoda na poli, která vrací počet prvků v poli, poskytuje ilustraci rozdílů mezi těmito třemi.

Za prvé, NULL pole:

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

Zde se zobrazí chyba. Nemůžeme zjistit, kolik prvků je v l_null_array protože nemáme pole, ve kterém bychom našli počet prvků.

Za druhé, prázdné pole:

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.

Zde můžeme najít počet prvků v prázdném poli a toto číslo je nula.

Nakonec pole obsahující pouze 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.

Toto pole má v sobě jeden prvek a ten jeden prvek je NULL .

Všimněte si, že do NUMBER_ARRAY můžete předat tolik argumentů, kolik chcete funkce konstruktoru a tyto hodnoty budou počátečním obsahem pole. Například NUMBER_ARRAY(1, 4, 18, 11, 22, 6) vytvoří pole čísel se 6 prvky.

Jak tedy můžeme nastavit každý druh pole pomocí JDBC?

  • Chcete-li nastavit NULL pole, použijte

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

    jak jste to udělali výše.

  • Pro prázdné pole použijte:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Pro pole obsahující jeden NULL pouze hodnotu, použijte

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

Používám Integer pole v těchto příkladech, ale měly by fungovat i jiné číselné typy.




  1. Funkce TANH() v Oracle

  2. PDO IN() Array Statement A zástupný symbol

  3. Jak nejlépe zobrazit v terminálu MySQL SELECT, který vrací příliš mnoho polí?

  4. 'mysqldump' není rozpoznán jako interní nebo externí příkaz