цикл по массиву для условия где PL / SQL - PullRequest
0 голосов
/ 04 декабря 2018

Возможно ли в pl / sql циклически проходить через несколько идентификаторов, которые должны быть указаны в предложении WHERE инструкции pl / sql.Сам оператор sql довольно прост, но мне нужно перебрать несколько идентификаторов:

SELECT x_name
FROM table_x
WHERE x_id = {array of 90 id's};

Как я могу вставить сюда 90 идентификаторов, чтобы sql итерировал их?Я пытался использовать курсор для цикла, но я застрял.Приведенный ниже код ошибочен, но он может указывать на то, чего я пытаюсь достичь здесь

DECLARE
  TYPE x_id_array IS VARRAY(3) OF NUMBER;
  CURSOR cur_x_id (x_ondz_id NUMBER) IS
  SELECT x_name
  FROM table_x
  WHERE x_id = var_ondz_id;
  loop_total integer;
  x_id x_id_array;
  name VARCHAR;
BEGIN
  x_id_new := x_id_array(8779254, 8819930, 8819931); --3 for testing
  loop_total := x_id_new.count;
  FOR i in 1 .. loop_total LOOP
    dbms_output.put_line('x_id: ' || x_id_new(i) || '= Name: ' || x_name );
  END LOOP;
END;
/

Ожидаемый результат будет

x_id: 8779254= Name: Name_1 
x_id: 8819930= Name: Name_2
x_id: 8819931= Name: Name_3
...
... etc for all 90 id's in the array 

Любая помощь приветствуется

1 Ответ

0 голосов
/ 04 декабря 2018

Мы можем использовать функцию TABLE для коллекции, чтобы получить список чисел / символов.

SELECT *
FROM TABLE ( sys.odcinumberlist(8779254,8819930,8819931) );

8779254
8819930
8819931

Здесь я использую внутренний VARRAY Oracle с пределом 32767. Вы можете использоватьсвой собственный NESTED TABLE тип.

create OR REPLACE TYPE yourtype AS TABLE OF NUMBER;

и затем выберите его.

SELECT *
FROM TABLE ( yourtype(8779254,8819930,8819931) );

Итак, ваш запрос может быть просто записан как

SELECT x_name
FROM table_x
WHERE x_id IN ( SELECT * FROM 
       TABLE ( yourtype(8779254,8819930,8819931) ) );

12.2 ивыше, вам даже не нужно указывать TABLE.

SELECT * FROM yourtype(8779254,8819930,8819931) works.

...