Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gespeicherte Oracle-Prozedur mit Parametern für die IN-Klausel

Die Verwendung von CSV ist wahrscheinlich der einfachste Weg, vorausgesetzt, Sie können zu 100 % sicher sein, dass Ihre Elemente selbst keine Zeichenfolgen enthalten.

Eine alternative und wahrscheinlich robustere Möglichkeit, dies zu tun, besteht darin, einen benutzerdefinierten Typ als Tabelle mit Zeichenfolgen zu erstellen. Angenommen, Ihre Zeichenfolgen wären nie länger als 100 Zeichen, dann könnten Sie Folgendes haben:

CREATE TYPE string_table AS TABLE OF varchar2(100);

Sie können dann eine Variable dieses Typs an Ihre gespeicherte Prozedur übergeben und direkt darauf verweisen. In Ihrem Fall etwa so:

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

Die table() -Funktion verwandelt Ihren benutzerdefinierten Typ in eine Tabelle mit einer einzelnen Spalte "COLUMN_VALUE", die Sie dann wie jede andere Tabelle behandeln können (auch Joins oder in diesem Fall Unterauswahlen).

Das Schöne daran ist, dass Oracle einen Konstruktor für Sie erstellt, sodass Sie beim Aufrufen Ihrer gespeicherten Prozedur einfach Folgendes schreiben können:

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

Ich gehe davon aus, dass Sie diesen Befehl programmatisch aus C# erstellen können.

Abgesehen davon haben wir in meiner Firma eine Reihe dieser benutzerdefinierten Typen als Standard für Listen von Strings, Doubles, Ints und so weiter definiert. Wir verwenden auch Oracle JPublisher, um diese Typen direkt in entsprechende Java-Objekte abbilden zu können. Ich habe mich kurz umgesehen, aber ich konnte keine direkten Entsprechungen für C # finden. Ich dachte nur, ich erwähne es, falls Java-Entwickler auf diese Frage stoßen.