Oracle
 sql >> Base de données >  >> RDS >> Oracle

Procédure stockée Oracle avec paramètres pour la clause IN

Utiliser CSV est probablement le moyen le plus simple, en supposant que vous pouvez être sûr à 100 % que vos éléments eux-mêmes ne contiendront pas de chaînes.

Une méthode alternative, et probablement plus robuste, consiste à créer un type personnalisé sous la forme d'une table de chaînes. En supposant que vos chaînes ne dépassent jamais 100 caractères, vous pourriez avoir :

CREATE TYPE string_table AS TABLE OF varchar2(100);

Vous pouvez ensuite passer une variable de ce type dans votre procédure stockée et la référencer directement. Dans votre cas, quelque chose comme ceci :

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() transforme votre type personnalisé en une table avec une seule colonne "COLUMN_VALUE", que vous pouvez ensuite traiter comme n'importe quelle autre table (tout comme les jointures ou, dans ce cas, les sous-sélections).

La beauté de ceci est qu'Oracle créera un constructeur pour vous, donc lors de l'appel de votre procédure stockée, vous pouvez simplement écrire :

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

Je suppose que vous pouvez gérer la création de cette commande par programmation à partir de C#.

Soit dit en passant, dans mon entreprise, nous avons un certain nombre de ces types personnalisés définis comme standard pour les listes de chaînes, doubles, entiers, etc. Nous utilisons également Oracle JPublisher pour pouvoir mapper directement ces types dans les objets Java correspondants. J'ai jeté un coup d'œil rapide mais je n'ai pas pu voir d'équivalents directs pour C#. Je pensais juste le mentionner au cas où les développeurs Java tomberaient sur cette question.