sql >> Databáze >  >> RDS >> Oracle

Uložená procedura Oracle s parametry pro klauzuli IN

Použití CSV je pravděpodobně nejjednodušší způsob, za předpokladu, že si můžete být 100% jisti, že vaše prvky samy nebudou obsahovat řetězce.

Alternativní a pravděpodobně robustnější způsob, jak toho dosáhnout, je vytvořit vlastní typ jako tabulku řetězců. Předpokládejme, že vaše řetězce nebyly nikdy delší než 100 znaků, pak byste mohli mít:

CREATE TYPE string_table AS TABLE OF varchar2(100);

Proměnnou tohoto typu pak můžete předat do uložené procedury a přímo na ni odkazovat. Ve vašem případě něco takového:

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() funkce promění váš vlastní typ na tabulku s jedním sloupcem "COLUMN_VALUE", se kterým můžete zacházet jako s jakoukoli jinou tabulkou (takže se spojí nebo v tomto případě podvýběry).

Krása toho je, že Oracle za vás vytvoří konstruktor, takže při volání uložené procedury můžete jednoduše napsat:

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

Předpokládám, že tento příkaz zvládnete vytvořit programově z C#.

Kromě toho v mé společnosti máme řadu těchto vlastních typů definovaných jako standard pro seznamy řetězců, double, ints a tak dále. Využíváme také Oracle JPublisher, abychom mohli mapovat přímo z těchto typů do odpovídajících objektů Java. Rychle jsem se rozhlédl, ale neviděl jsem žádné přímé ekvivalenty pro C#. Jen jsem si myslel, že to zmíním pro případ, že by vývojáři Javy narazili na tuto otázku.



  1. Jak vyřešit ORA-28000 účet je uzamčen

  2. T-SQL - Vložit data do nadřazených a podřízených tabulek

  3. Jak exportovat databázi SQL Serveru do MySQL?

  4. Jak vytvořit dočasnou tabulku v SQL?