Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Nie działa ustawienie PrepareStatement NULL dla tablicy NUMBER_ARRAY

Wygląda na to, że masz pewne zamieszanie dotyczące tablic pustych, tablic pustych i tablic zawierających tylko jeden NULL wartość.

NULL tablica to brak tablicy, w taki sam sposób jak NULL liczba to brak liczby. Pusta tablica to tablica, która istnieje, ale zawiera 0 elementów. Oba różnią się od NUMBER_ARRAY(null) , która jest tablicą zawierającą pojedynczy NULL wartość.

COUNT Metoda na tablicy, która zwraca liczbę elementów w tablicy, stanowi ilustrację różnic między tymi trzema.

Po pierwsze, NULL tablica:

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

Tutaj pojawia się błąd. Nie możemy dowiedzieć się, ile elementów jest w l_null_array ponieważ nie mamy tablicy do znalezienia liczby elementów.

Po drugie, pusta tablica:

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.

Tutaj możemy znaleźć liczbę elementów w pustej tablicy, a ta liczba wynosi zero.

Wreszcie tablica zawierająca tylko 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.

Ta tablica zawiera jeden element, a ten jeden element to NULL .

Pamiętaj, że możesz przekazać dowolną liczbę argumentów do NUMBER_ARRAY konstruktora, a te wartości będą początkową zawartością tablicy. Na przykład NUMBER_ARRAY(1, 4, 18, 11, 22, 6) tworzy tablicę liczb z 6 elementami.

Jak więc ustawić każdy rodzaj tablicy za pomocą JDBC?

  • Aby ustawić NULL tablica, użyj

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

    tak jak zrobiłeś powyżej.

  • Dla pustej tablicy użyj:

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Dla tablicy zawierającej pojedynczy NULL tylko wartość, użyj

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

Używam Integer tablicy w tych przykładach, ale inne typy liczbowe również powinny działać.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Potrzebujesz pomocy w zrozumieniu zachowania SELECT ... FOR UPDATE powodującego zakleszczenie

  2. Wartość wstawiona do tabeli w oracle nie została zapisana?

  3. Dlaczego Oracle używa DBMS_STATS.GATHER_TABLE_STATS?

  4. java.security.AccessControlException:odmowa dostępu (java.security.SecurityPermission authProvider.SunMSCAPI)

  5. Jak używać parametru tablicy/tabeli do Oracle (ODP.NET 10g) za pośrednictwem ADO.NET/C#?