Używanie CSV jest prawdopodobnie najprostszym sposobem, zakładając, że możesz być w 100% pewien, że Twoje elementy nie będą zawierać łańcuchów.
Alternatywnym i prawdopodobnie bardziej niezawodnym sposobem na zrobienie tego jest utworzenie niestandardowego typu jako tablicy łańcuchów. Przypuśćmy, że twoje ciągi nigdy nie były dłuższe niż 100 znaków, wtedy możesz mieć:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Następnie można przekazać zmienną tego typu do procedury składowanej i odwoływać się do niej bezpośrednio. W twoim przypadku coś takiego:
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()
funkcja zamienia Twój typ niestandardowy w tabelę z pojedynczą kolumną „COLUMN_VALUE”, którą możesz następnie traktować jak każdą inną tabelę (tak samo jak łączenia lub, w tym przypadku, podselekcje).
Piękno tego polega na tym, że Oracle utworzy dla Ciebie konstruktor, więc podczas wywoływania procedury składowanej możesz po prostu napisać:
execute_update(string_table('foo','bar','baz'), 32);
Zakładam, że możesz obsłużyć tworzenie tego polecenia programowo z C#.
Na marginesie, w mojej firmie mamy kilka takich niestandardowych typów zdefiniowanych jako standardowe dla list ciągów, podwójnych, int i tak dalej. Korzystamy również z Oracle JPublisher, aby móc mapować bezpośrednio z tych typów na odpowiednie obiekty Java. Szybko się rozejrzałem, ale nie widziałem żadnych bezpośrednich odpowiedników dla C#. Pomyślałem, że wspomnę o tym na wypadek, gdyby programiści Java natknęli się na to pytanie.