Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle - В CLAUSE въпрос при използване с множество стойности, което го прави динамичен

За съжаление, ако вашият тип колекция е дефиниран в PL/SQL (а не в SQL), не можете да го използвате в SQL, защото SQL машината не знае как да се справи с него.

Ако вместо това сте дефинирали типа колекция в SQL, т.е.

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

След това можете да направите нещо като

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

в зависимост от версията на Oracle-- синтаксисът за използване на колекции в SQL е еволюирал с времето-- по-старите версии на Oracle имаха по-сложен синтаксис.

Можете да конвертирате PL/SQL асоциативен масив (вашият VARCHAR_ARRAY_TYPE) в колекция от SQL вложени таблици в PL/SQL, но това изисква повторение през асоциативния масив и попълване на вложената таблица, което е малко неприятно. Ако приемем, че VARCHAR_TBL вече е създадена колекция от вложени таблици

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

можете да конвертирате от асоциативния масив към вложената таблица и да използвате вложената таблица в SQL израз като този (използвайки таблицата 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;

Тъй като преобразуването между типове колекции е малко трудно обаче, обикновено би било по-добре просто да използвате колекцията от вложени таблици (и да я предадете на съхранената процедура), освен ако няма конкретна причина, поради която е необходим асоциативният масив.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ГРЕШКА на ред:PL/SQL:SQL изразът е игнориран. докато създавате/заменяте тялото на пакета

  2. Как мога да съхранявам байтове в Oracle Varchar2 и ASCII да се третира като текст

  3. Глобален неразделен индекс в Oracle

  4. Курсор на Oracle за присвояване

  5. ORACLe ПРОЦЕДУРА - AUTHID разрешен само на ниво схема