Použití CSV je pravděpodobně nejjednodušší způsob, za předpokladu, že si můžete být 100% jisti, že vaše prvky samy nebudou obsahovat řetězce.
Alternativní a pravděpodobně robustnější způsob, jak toho dosáhnout, je vytvořit vlastní typ jako tabulku řetězců. Předpokládejme, že vaše řetězce nebyly nikdy delší než 100 znaků, pak byste mohli mít:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Proměnnou tohoto typu pak můžete předat do uložené procedury a přímo na ni odkazovat. Ve vašem případě něco takového:
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()
funkce promění váš vlastní typ na tabulku s jedním sloupcem "COLUMN_VALUE", se kterým můžete zacházet jako s jakoukoli jinou tabulkou (takže se spojí nebo v tomto případě podvýběry).
Krása toho je, že Oracle za vás vytvoří konstruktor, takže při volání uložené procedury můžete jednoduše napsat:
execute_update(string_table('foo','bar','baz'), 32);
Předpokládám, že tento příkaz zvládnete vytvořit programově z C#.
Kromě toho v mé společnosti máme řadu těchto vlastních typů definovaných jako standard pro seznamy řetězců, double, ints a tak dále. Využíváme také Oracle JPublisher, abychom mohli mapovat přímo z těchto typů do odpovídajících objektů Java. Rychle jsem se rozhlédl, ale neviděl jsem žádné přímé ekvivalenty pro C#. Jen jsem si myslel, že to zmíním pro případ, že by vývojáři Javy narazili na tuto otázku.