Oracle
 sql >> база данни >  >> RDS >> Oracle

използвайки стойности, разделени със запетая, в клауза IN за колона NUMBER

Наистина ли трябва да върнете списък, разделен със запетая? По принцип би било много по-добре да се декларира тип колекция

CREATE TYPE num_table
    AS TABLE OF NUMBER;

Декларирайте функция, която връща екземпляр от тази колекция

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;

и след това използвайте тази колекция във вашата заявка

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

Възможно е да се използва и динамичен SQL (което @Sebas демонстрира). Недостатъкът на това обаче е, че всяко извикване на процедурата ще генерира нов SQL израз, който трябва да бъде анализиран отново, преди да бъде изпълнен. Освен това оказва натиск върху кеша на библиотеката, което може да накара Oracle да изчисти много други SQL изрази за многократна употреба, което може да създаде много други проблеми с производителността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на LogMiner за намиране на текущи промени

  2. Вмъкване и актуализиране на базата на записи в Oracle

  3. Функция LOCALTIMESTAMP() в Oracle

  4. Функция JSON_OBJECT() в Oracle

  5. Дългите низове в N-Hibernate с Oracle причиняват грешка