sql >> Databasteknik >  >> RDS >> Oracle

använder kommaseparerade värden inuti IN-satsen för NUMMER-kolumnen

Behöver du verkligen returnera en kommaseparerad lista? Det skulle generellt sett vara mycket bättre att deklarera en samlingstyp

CREATE TYPE num_table
    AS TABLE OF NUMBER;

Deklarera en funktion som returnerar en instans av denna samling

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;

och använd sedan den samlingen i din fråga

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

Det är möjligt att använda dynamisk SQL också (vilket @Sebas demonstrerar). Nackdelen med det är dock att varje anrop till proceduren kommer att generera en ny SQL-sats som måste analyseras igen innan den exekveras. Det sätter också press på bibliotekscachen vilket kan få Oracle att rensa massor av andra återanvändbara SQL-satser som kan skapa många andra prestandaproblem.



  1. Datum i en URL dd/mm/åååå

  2. Ett exempel för att demonstrera sårbarheten hos SQL-injektion och dess förebyggande i Oracle

  3. MySQL &MariaDB Lastbalansering med ProxySQL

  4. Hur man listar alla vyer i Oracle Database