Использование типа таблицы в предложении IN в процедуре PLSQL

У меня есть процедура, которая принимает входной параметр табличного типа. Теперь я должен использовать этот параметр в предложении IN запроса SELECT.

CREATE TYPE ids IS TABLE OF NUMBER;

CREATE PROCEDURE (emp_ids IN ids) IS

CURSOR IS (SELECT * FROM EMPLOYEES WHERE EMP_ID IN (SELECT * FROM TABLE(emp_ids)); .....

Но я обнаружил, что этот код не будет работать, поскольку локальные типы коллекций нельзя использовать в операторе SQL.

Есть ли альтернативный способ добиться использования параметра типа таблицы в инструкции SELECT?


person Abdul Mubeen    schedule 16.12.2012    source источник


Ответы (1)


Согласно тому, что вы опубликовали, вы объявляете коллекцию как объект схемы, а не локальный тип. Это означает, что у вас не должно возникнуть проблем с его использованием. Вот пример:

-- collection type as schema object
SQL> create or replace type ids is table of number;
  2  /

Type created

SQL> create or replace procedure proc1 (emp_ids IN ids)
  2  IS
  3     cursor c is (
  4       select first_name
  5         from employees
  6        where employee_id in (select column_value
  7                                from table(emp_ids)
  8                              )
  9     );
 10  begin
 11    for i in c
 12    loop
 13       dbms_output.put_line(i.first_name);
 14    end loop;
 15  end;
 16  /

Procedure created

SQL> exec proc1(ids(101, 103, 200));

Neena
Alexander
Jennifer

PL/SQL procedure successfully completed
person Nick Krasnov    schedule 16.12.2012
comment
Спасибо за ваш быстрый ответ. Но когда я объявляю объект коллекции в пакете и использую его в запросе SELECT, я сталкиваюсь с ошибкой «локальные типы коллекций не могут использоваться в инструкции SQL». Есть ли другой способ использовать его на уровне пакета? - person Abdul Mubeen; 16.12.2012
comment
@AbdulMubeen К сожалению, вы не можете, и в сообщении это очень четко указано, использовать тип pl/sql (независимо от того, объявлен ли этот тип в хранимой процедуре или в теле\спецификации пакета) в операторе sql. Итак, ваш выбор - создать тип sql. - person Nick Krasnov; 16.12.2012