Использование 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», который затем можно лечить, как и любую другую таблицу (так что присоединяется или, в этом case, subselects).
Красоту этого является то, что Oracle будет создать конструктор для вас, так что при вызове хранимой процедуры вы можете просто написать:
execute_update(string_table('foo','bar','baz'), 32);
Я предполагаю, что вы можете справиться строить эту команду из программно C#.
Как в стороне, в моей компании у нас есть несколько таких пользовательских типов, которые определены как стандартные для списков строк, парных, ints и т. Д. Мы также используем Oracle JPublisher, чтобы иметь возможность напрямую сопоставлять эти типы с соответствующими объектами Java. Я быстро осмотрелся, но я не видел прямых эквивалентов для C#. Просто подумал, что я упомянул об этом, если Java-разработчики столкнутся с этим вопросом.
Нечто подобное можно сделать с помощью PL/SQL, но быстрее передать коллекцию в процедуру как строку csv. Строка csv должна быть указана сначала в PL/SQL. – tuinstoel 2009-01-04 20:08:52