sql >> Base de Datos >  >> RDS >> Oracle

Procedimiento almacenado de Oracle con parámetros para la cláusula IN

Usar CSV es probablemente la forma más sencilla, suponiendo que pueda estar 100 % seguro de que sus elementos no contendrán cadenas.

Una forma alternativa, y probablemente más robusta, de hacer esto es crear un tipo personalizado como una tabla de cadenas. Suponiendo que sus cadenas nunca hayan tenido más de 100 caracteres, entonces podría tener:

CREATE TYPE string_table AS TABLE OF varchar2(100);

Luego puede pasar una variable de este tipo a su procedimiento almacenado y hacer referencia a ella directamente. En tu 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 table() convierte su tipo personalizado en una tabla con una sola columna "COLUMN_VALUE", que luego puede tratar como cualquier otra tabla (así como las uniones o, en este caso, las subselecciones).

Lo bueno de esto es que Oracle creará un constructor para usted, por lo que cuando llame a su procedimiento almacenado simplemente puede escribir:

execute_update(string_table('foo','bar','baz'), 32);

Supongo que puede manejar la creación de este comando programáticamente desde C#.

Aparte, en mi empresa tenemos varios de estos tipos personalizados definidos como estándar para listas de cadenas, dobles, enteros, etc. También hacemos uso de Oracle JPublisher para poder mapear directamente desde estos tipos a los objetos Java correspondientes. Eché un vistazo rápido, pero no pude ver ningún equivalente directo para C#. Solo pensé en mencionarlo en caso de que los desarrolladores de Java se encuentren con esta pregunta.