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

Oracle - W pytaniu CLAUSE podczas używania z wieloma wartościami, dzięki czemu jest dynamiczny

Niestety, jeśli typ twojej kolekcji jest zdefiniowany w PL/SQL (a nie w SQL), nie możesz go używać w SQL, ponieważ silnik SQL nie wie, jak go obsłużyć.

Jeśli zamiast tego zdefiniowałeś typ kolekcji w SQL, tj.

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

Następnie możesz zrobić coś takiego

SELECT col1
  FROM table1 t1
 WHERE t1.id IN (SELECT column_value
                   FROM TABLE( <<variable of type varchar2_tbl>> ) )

w zależności od wersji Oracle - składnia do używania kolekcji w SQL ewoluowała z biegiem czasu - starsze wersje Oracle miały bardziej złożoną składnię.

Możesz przekonwertować tablicę asocjacyjną PL/SQL (Twój VARCHAR_ARRAY_TYPE) na zagnieżdżoną kolekcję tabel SQL w PL/SQL, ale wymaga to iteracji przez tablicę asocjacyjną i wypełnienia zagnieżdżonej tabeli, co jest trochę uciążliwe. Zakładając, że VARCHAR_TBL zagnieżdżona kolekcja tabel została już utworzona

SQL> CREATE OR REPLACE TYPE varchar_tbl
         IS TABLE OF varchar2(40);

możesz dokonać konwersji z tablicy asocjacyjnej do tabeli zagnieżdżonej i użyć tabeli zagnieżdżonej w takiej instrukcji SQL (używając tabeli SCOTT.EMP)

declare
  type varchar_array_type
    is table of varchar2(40)
       index by binary_integer;
  l_associative_array varchar_array_type;
  l_index             binary_integer;
  l_nested_table      varchar_tbl := new varchar_tbl();
  l_cnt               pls_integer;
begin
  l_associative_array( 1 ) := 'FORD';
  l_associative_array( 10 ) := 'JONES';
  l_associative_array( 100 ) := 'NOT A NAME';
  l_associative_array( 75 ) := 'SCOTT';
  l_index := l_associative_array.FIRST;
  while( l_index IS NOT NULL )
  loop
    l_nested_table.EXTEND;
    l_nested_table( l_nested_table.LAST ) :=
             l_associative_array( l_index );
    l_index := l_associative_array.NEXT( l_index );
  end loop;
  SELECT COUNT(*)
    INTO l_cnt
    FROM emp
   WHERE ename IN (SELECT column_value
                     FROM TABLE( l_nested_table ) );
  dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

Ponieważ konwersja między typami kolekcji jest trochę uciążliwa, zazwyczaj lepiej byłoby po prostu użyć zagnieżdżonej kolekcji tabel (i przekazać ją do procedury składowanej), chyba że istnieje konkretny powód, dla którego tablica asocjacyjna jest potrzebna.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmień kolejność kolumn tabeli w Oracle

  2. Oracle:unikatowość selektywna indeksu na podstawie funkcji

  3. Czy przeniesienie tabeli/partycji do innego obszaru tabel przerwania zapytań uzyskujących dostęp do tej tabeli/partycji?

  4. Klient błyskawiczny Docker Oracle

  5. Lepsze zarządzanie pamięcią (stertą) w systemie Solaris 10