Я ничего не знаю об ODP.net, но зачем объединять все идентификаторы записей в строку CSV?
Лучшим подходом может быть создание параметра массива в вашей процедуре и передача массива идентификаторов. Я полагаю, это зависит от того, откуда вы получаете список идентификаторов и начинаются ли они как массив или строка CSV?
Вот пример использования типа массива и присоединения его к вашему запросу без использования временной таблицы (вы могли бы сделать нечто подобное со списком IN, но его сложнее связать):
create or replace type my_test_type as object (id integer);
create or replace type my_test_type_a as table of my_test_type;
create or replace procedure my_test_proc(i_ids in my_test_type_a)
is
begin
for row in (
select a.l from
(
select level l from dual connect by level <= 10
) a, table(i_ids) b
where a.l = b.id
) loop
dbms_output.put_line(row.l);
end loop;
end;
/
Обратите внимание, что в запросе в процедуре теста используется функция 'table', чтобы превратить переданный массив в таблицу в запросе, к которому вы можете фактически присоединить другие реальные таблицы.
Также не то, чтобы подзапрос 'a' использовал хитрость для создания поддельной тестовой таблицы, содержащей 10 строк со значениями от 1 до 10 (это просто тестовые данные, чтобы доказать, что это работает).
Используя следующий блок, мы можем проверить работоспособность кода:
declare
v_id my_test_type;
v_ids my_test_type_a;
begin
v_id := my_test_type(1);
v_ids := my_test_type_a();
for i in 1.. 5 loop
v_id := my_test_type(i);
v_ids.extend;
v_ids(i) := v_id;
end loop;
my_test_proc(v_ids);
end;
/
Пока включен dbms_output, это должно вывести 1 - 5, так как таблица тестовых данных объединена с вашим массивом!