Att använda CSV är förmodligen det enklaste sättet, förutsatt att du kan vara 100 % säker på att dina element inte själva innehåller strängar.
Ett alternativt, och förmodligen mer robust, sätt att göra detta på är att skapa en anpassad typ som en tabell med strängar. Om du antar att dina strängar aldrig var längre än 100 tecken, då kan du ha:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Du kan sedan skicka en variabel av denna typ till din lagrade procedur och referera till den direkt. I ditt fall, något i stil med detta:
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()
funktion förvandlar din anpassade typ till en tabell med en enda kolumn "COLUMN_VALUE", som du sedan kan behandla som vilken annan tabell som helst (det gör också joins eller, i det här fallet, subselects).
Det fina med detta är att Oracle kommer att skapa en konstruktor åt dig, så när du anropar din lagrade procedur kan du helt enkelt skriva:
execute_update(string_table('foo','bar','baz'), 32);
Jag antar att du kan hantera att bygga upp det här kommandot programmässigt från C#.
För övrigt har vi på mitt företag ett antal av dessa anpassade typer definierade som standard för listor med strängar, dubblar, ints och så vidare. Vi använder oss även av Oracle JPublisher för att kunna mappa direkt från dessa typer till motsvarande Java-objekt. Jag tittade snabbt runt men kunde inte se några direkta motsvarigheter för C#. Tänkte bara nämna det ifall Java-utvecklare stöter på den här frågan.