Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Procedura składowana Oracle z parametrami dla klauzuli IN

Używanie CSV jest prawdopodobnie najprostszym sposobem, zakładając, że możesz być w 100% pewien, że Twoje elementy nie będą zawierać łańcuchów.

Alternatywnym i prawdopodobnie bardziej niezawodnym sposobem na zrobienie tego jest utworzenie niestandardowego typu jako tablicy łańcuchów. Przypuśćmy, że twoje ciągi nigdy nie były dłuższe niż 100 znaków, wtedy możesz mieć:

CREATE TYPE string_table AS TABLE OF varchar2(100);

Następnie można przekazać zmienną tego typu do procedury składowanej i odwoływać się do niej bezpośrednio. W twoim przypadku coś takiego:

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() funkcja zamienia Twój typ niestandardowy w tabelę z pojedynczą kolumną „COLUMN_VALUE”, którą możesz następnie traktować jak każdą inną tabelę (tak samo jak łączenia lub, w tym przypadku, podselekcje).

Piękno tego polega na tym, że Oracle utworzy dla Ciebie konstruktor, więc podczas wywoływania procedury składowanej możesz po prostu napisać:

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

Zakładam, że możesz obsłużyć tworzenie tego polecenia programowo z C#.

Na marginesie, w mojej firmie mamy kilka takich niestandardowych typów zdefiniowanych jako standardowe dla list ciągów, podwójnych, int i tak dalej. Korzystamy również z Oracle JPublisher, aby móc mapować bezpośrednio z tych typów na odpowiednie obiekty Java. Szybko się rozejrzałem, ale nie widziałem żadnych bezpośrednich odpowiedników dla C#. Pomyślałem, że wspomnę o tym na wypadek, gdyby programiści Java natknęli się na to pytanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Monitorowanie SQL w SQL Developer

  2. Oracle:jak pogrupować według zakresu?

  3. czy można mieć generator sekwencji alfanumerycznych w sql

  4. Oracle Konwertuj TIMESTAMP ze strefą czasową na DATE

  5. Korzystanie z Oracle JDeveloper 12c z Oracle Database 12c na Oracle Cloud Platform, część 2