Как передать все значения массива для выбора оператора за один раз
Привет я использую хранимую процедуру, которая принимает строковый параметр
'919860,919736,989087'
я конвертирую строку в массив, используя apex_util.string_to_table
array := apex_util.string_to_table('919860,919736,989087', ',');
Теперь я хочу передать все значения массива оператора выбора.
insert into table2 select * from table1 where mobile in (**all array values**);
2 ответа
Вы не можете использовать переменную "массив" в операторе выбора, потому что локальные типы коллекций не допускаются в операторе SQL.
Один вариант, который я лично предпочитаю, это использовать функцию INSTR, чтобы проверить, есть ли значение в списке:
insert into table2 select * from table1
where INSTR( ',' || '919860,919736,989087' || ','
, ',' || mobile || ',') > 0;
Другой вариант - написать конвейерную функцию, которая будет принимать APEX_APPLICATION_GLOBAL.VC_ARR2 в качестве параметра IN, который может возвращать тип коллекции, на который может ссылаться функция TABLE, например:
function array_rows(p_rows_in in APEX_APPLICATION_GLOBAL.VC_ARR2) return rows_t pipelined is
begin
for i in p_rows_in.first..p_rows_in.last loop
pipe row(p_rows_in(i));
end loop;
return;
end array_rows;
insert into table2 select * from table1 where mobile in (select column_value
from table(pkg_pipe_func.piped_rows(apex_util.string_to_table('919860,919736,989087', ','))));
Следующее должно сделать. Не проверено (очевидно).
insert into table2
select * from table1
where mobile in (select column_value from table(array));