El uso de CSV es probablemente la forma más sencilla, suponiendo que puede estar 100% seguro de que sus elementos no contendrán cadenas.
Una manera alternativa, y probablemente más robusta, de hacerlo es crear un tipo personalizado como una tabla de cadenas. Suponiendo sus cuerdas nunca fueron más de 100 caracteres, entonces usted podría tener:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Luego, puede pasar una variable de este tipo en su procedimiento almacenado y hacer referencia a ella directamente. En su caso, algo como esto:
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
La función table()
convierte su tipo personalizado en una tabla con una sola columna "column_value", que luego se puede tratar como cualquier otra tabla (también lo hacen une o, en este caso, subselecciones).
La belleza de esto es que Oracle creará un constructor para ti, así que cuando se llama a su procedimiento almacenado simplemente hay que escribir:
execute_update(string_table('foo','bar','baz'), 32);
Estoy asumiendo que usted puede manejar la construcción de este comando desde programáticamente DO#.
Como nota aparte, en mi empresa tenemos varios de estos tipos personalizados definidos como estándar para listas de cadenas, dobles, ints, etc. También utilizamos Oracle JPublisher para poder mapear directamente desde estos tipos en objetos Java correspondientes. Eché un vistazo rápido pero no pude ver ningún equivalente directo para C#. Solo pensé que lo mencionaría en caso de que los desarrolladores de Java encuentren esta pregunta.
Nota rápida: CSV no funcionará por sí solo, ya que Oracle lo tratará como una sola cadena. – sarsnake
¿No debería ser '... de string_table (identifierList)); ... '? –