sql >> Databasteknik >  >> RDS >> Oracle

Oracle lagrad procedur med parametrar för IN-sats

Att använda CSV är förmodligen det enklaste sättet, förutsatt att du kan vara 100 % säker på att dina element inte själva innehåller strängar.

Ett alternativt, och förmodligen mer robust, sätt att göra detta på är att skapa en anpassad typ som en tabell med strängar. Om du antar att dina strängar aldrig var längre än 100 tecken, då kan du ha:

CREATE TYPE string_table AS TABLE OF varchar2(100);

Du kan sedan skicka en variabel av denna typ till din lagrade procedur och referera till den direkt. I ditt fall, något i stil med detta:

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

table() funktion förvandlar din anpassade typ till en tabell med en enda kolumn "COLUMN_VALUE", som du sedan kan behandla som vilken annan tabell som helst (det gör också joins eller, i det här fallet, subselects).

Det fina med detta är att Oracle kommer att skapa en konstruktor åt dig, så när du anropar din lagrade procedur kan du helt enkelt skriva:

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

Jag antar att du kan hantera att bygga upp det här kommandot programmässigt från C#.

För övrigt har vi på mitt företag ett antal av dessa anpassade typer definierade som standard för listor med strängar, dubblar, ints och så vidare. Vi använder oss även av Oracle JPublisher för att kunna mappa direkt från dessa typer till motsvarande Java-objekt. Jag tittade snabbt runt men kunde inte se några direkta motsvarigheter för C#. Tänkte bara nämna det ifall Java-utvecklare stöter på den här frågan.



  1. Arbeta med icke-ASCII JDBC-data i Talend

  2. Hur man kör flera MySQL-instanser på samma maskin

  3. Fix:"Satsen BACKUP LOG är inte tillåten medan återställningsmodellen är SIMPLE" i SQL Server (och SQL Edge)

  4. Bästa tillvägagångssätt för grupperad median