Oracle
 sql >> Database >  >> RDS >> Oracle

Stored procedure Oracle con parametri per la clausola IN

L'uso di CSV è probabilmente il modo più semplice, supponendo che tu possa essere sicuro al 100% che i tuoi elementi non contengano stringhe.

Un modo alternativo, e probabilmente più robusto, per farlo è creare un tipo personalizzato come tabella di stringhe. Supponendo che le tue stringhe non siano mai più lunghe di 100 caratteri, potresti avere:

CREATE TYPE string_table AS TABLE OF varchar2(100);

È quindi possibile passare una variabile di questo tipo nella procedura memorizzata e farvi riferimento direttamente. Nel tuo caso, qualcosa del genere:

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() La funzione trasforma il tuo tipo personalizzato in una tabella con una singola colonna "COLUMN_VALUE", che puoi quindi trattare come qualsiasi altra tabella (quindi anche i join o, in questo caso, le subselect).

Il bello è che Oracle creerà un costruttore per te, quindi quando chiami la tua procedura memorizzata puoi semplicemente scrivere:

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

Presumo che tu possa gestire la creazione di questo comando in modo programmatico da C#.

Per inciso, nella mia azienda abbiamo un certo numero di questi tipi personalizzati definiti come standard per elenchi di stringhe, doppi, int e così via. Utilizziamo anche Oracle JPublisher per essere in grado di mappare direttamente da questi tipi negli oggetti Java corrispondenti. Ho dato una rapida occhiata in giro ma non sono riuscito a vedere alcun equivalente diretto per C#. Ho pensato di menzionarlo nel caso in cui gli sviluppatori Java si imbattessero in questa domanda.