Как воспользоваться коллекцией в WHERE клаузе с условием IN?
Возможно ли сделать что-то вроде следующего?
create or replace TYPE "TypeKeys" IS TABLE OF INTEGER;
/
Declare
Keys TypeKeys;
personT PERSON%ROWTYPE;
BEGIN
Keys := TypeKeys();
Keys.EXTEND(2);
Keys(1) := 14;
Keys(2) := 21;
SELECT * INTO personT FROM PERSON WHERE ID IN (Keys);
END;
/
Нужно найти записи по нескольким ID, которые содержатся в коллекции.
Свободный перевод вопроса It's possible to use a collection in WHERE clausule and condition IN? от участника @Isaac Perez
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Следует проверять условие вхождения в коллекцию - MEMBER Condition.
Или классически, получить лист значений в подзапросе с Table Collection Expression.
Оба варианта в воспроизводимом примере:
create table person (id, name) as
select 1, 'xxx' from dual union all
select 14, 'aaa' from dual union all
select 21, 'bbb' from dual
/
create or replace type typeKeys is table of integer
/
declare
keys typeKeys := typeKeys (14, 21);
type personT is table of person%rowtype;
pers personT;
begin
select * bulk collect into pers
from person
where id member of Keys
union all
select *
from person
where id in (select column_value from table (Keys));
for i in 1..pers.count loop
dbms_output.put_line ('row='||pers(i).id||' '||pers(i).name);
end loop;
end;
/
row=14 aaa
row=21 bbb
row=14 aaa
row=21 bbb