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

Verwenden von kommagetrennten Werten in der IN-Klausel für die NUMBER-Spalte

Müssen Sie wirklich eine durch Kommas getrennte Liste zurückgeben? Es wäre im Allgemeinen viel besser, einen Sammlungstyp zu deklarieren

CREATE TYPE num_table
    AS TABLE OF NUMBER;

Deklarieren Sie eine Funktion, die eine Instanz dieser Sammlung zurückgibt

CREATE OR REPLACE FUNCTION get_nums
  RETURN num_table
IS
  l_nums num_table := num_table();
BEGIN
  for i in 1 .. 10
  loop
    l_nums.extend;
    l_nums(i) := i*2;
  end loop;
END;

und dann diese Sammlung in Ihrer Abfrage verwenden

SELECT *
  FROM users_table
 WHERE user_id IN (SELECT * FROM TABLE( l_nums ));

Es ist auch möglich, dynamisches SQL zu verwenden (was @Sebas demonstriert). Der Nachteil dabei ist jedoch, dass jeder Aufruf der Prozedur eine neue SQL-Anweisung generiert, die erneut analysiert werden muss, bevor sie ausgeführt wird. Es übt auch Druck auf den Bibliotheks-Cache aus, was dazu führen kann, dass Oracle viele andere wiederverwendbare SQL-Anweisungen löscht, was viele andere Leistungsprobleme verursachen kann.