Как передать все значения массива для выбора оператора за один раз

Привет я использую хранимую процедуру, которая принимает строковый параметр

 '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));
Другие вопросы по тегам