sql >> Database >  >> RDS >> Oracle

Opgeslagen Oracle-procedure met parameters voor IN-clausule

CSV gebruiken is waarschijnlijk de eenvoudigste manier, ervan uitgaande dat je er 100% zeker van kunt zijn dat je elementen zelf geen strings zullen bevatten.

Een alternatieve, en waarschijnlijk meer robuuste manier om dit te doen, is door een aangepast type te maken als een tabel met tekenreeksen. Stel dat uw strings nooit langer zijn dan 100 tekens, dan zou u het volgende kunnen doen:

CREATE TYPE string_table AS TABLE OF varchar2(100);

U kunt dan een variabele van dit type doorgeven aan uw opgeslagen procedure en er rechtstreeks naar verwijzen. In jouw geval zoiets als dit:

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

De table() functie verandert uw aangepaste type in een tabel met een enkele kolom "COLUMN_VALUE", die u vervolgens kunt behandelen als elke andere tabel (evenals joins of, in dit geval, subselecties).

Het mooie hiervan is dat Oracle een constructor voor u zal maken, dus wanneer u uw opgeslagen procedure aanroept, kunt u eenvoudig schrijven:

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

Ik neem aan dat je dit commando programmatisch kunt opbouwen vanuit C#.

Even terzijde, bij mijn bedrijf hebben we een aantal van deze custom types standaard gedefinieerd voor lijsten met strings, doubles, ints enzovoort. We maken ook gebruik van Oracle JPublisher om rechtstreeks van deze typen naar corresponderende Java-objecten te kunnen mappen. Ik heb even rondgekeken, maar ik kon geen directe equivalenten voor C# zien. Ik dacht dat ik het zou vermelden voor het geval Java-ontwikkelaars deze vraag tegenkomen.



  1. Uw MS SQL-replicatie beheren

  2. Gemiste optimalisaties omzeilen

  3. Selecteer alle maanden binnen een bepaalde periode, inclusief die met 0 waarden

  4. Laravel:PDOException:kon stuurprogramma niet vinden