Brug af CSV er nok den enkleste måde, forudsat at du kan være 100 % sikker på, at dine elementer ikke selv indeholder strenge.
En alternativ og sandsynligvis mere robust måde at gøre dette på er at oprette en brugerdefineret type som en tabel med strenge. Hvis du antager, at dine strenge aldrig var længere end 100 tegn, så kunne du have:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Du kan derefter overføre en variabel af denne type til din lagrede procedure og referere den direkte. I dit tilfælde noget som dette:
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 gør din brugerdefinerede type til en tabel med en enkelt kolonne "COLUMN_VALUE", som du derefter kan behandle som enhver anden tabel (det samme gør joins eller, i dette tilfælde, subselects).
Skønheden ved dette er, at Oracle vil oprette en konstruktør til dig, så når du kalder din lagrede procedure kan du blot skrive:
execute_update(string_table('foo','bar','baz'), 32);
Jeg går ud fra, at du kan håndtere at opbygge denne kommando programmatisk fra C#.
Som en sidebemærkning har vi i mit firma en række af disse brugerdefinerede typer defineret som standard for lister over strenge, doubler, ints og så videre. Vi gør også brug af Oracle JPublisher for at kunne mappe direkte fra disse typer til tilsvarende Java-objekter. Jeg kiggede hurtigt rundt, men jeg kunne ikke se nogen direkte ækvivalenter til C#. Tænkte lige, at jeg ville nævne det, hvis Java-udviklere støder på dette spørgsmål.