Использование CSV, вероятно, самый простой способ, при условии, что вы можете быть на 100% уверены, что ваши элементы сами не будут содержать строки.
Альтернативный и, возможно, более надежный способ сделать это - создать пользовательский тип в виде таблицы строк. Предположим, что ваши строки никогда не были длиннее 100 символов, тогда вы могли бы иметь:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Затем вы можете передать переменную этого типа в вашу хранимую процедуру и напрямую ссылаться на нее. В твоем случае примерно так:
FUNCTION EXECUTE_UPDATE(
identifierList string_table,
value int)
RETURN int
IS
BEGIN
[...other stuff...]
update table1 set col1 = col1 - value
where id in (select column_value from table(identifierList));
RETURN SQL%ROWCOUNT;
END
Функция table()
превращает ваш пользовательский тип в таблицу с одним столбцом "COLUMN_VALUE", которую вы затем можете обрабатывать как любую другую таблицу (то же самое можно сделать с присоединениями или, в этом случае, с помощью выбора).
Прелесть этого в том, что Oracle создаст для вас конструктор, поэтому при вызове хранимой процедуры вы можете просто написать:
execute_update(string_table('foo','bar','baz'), 32);
Я предполагаю, что вы можете обработать эту команду программно из C #.
Кроме того, в моей компании у нас есть ряд этих пользовательских типов, определенных как стандартные для списков строк, двойных чисел, целых и т. Д. Мы также используем Oracle JPublisher , чтобы иметь возможность напрямую сопоставлять эти типы с соответствующими объектами Java. Я быстро осмотрелся вокруг, но я не увидел прямых эквивалентов для C #. Просто подумал, что упомяну об этом на случай, если разработчики Java столкнутся с этим вопросом.