Как объединить параметры вложенных таблиц? - PullRequest
1 голос
/ 17 мая 2019

enter image description here

У меня есть две процедуры.Когда вторая процедура вызывается процедурой 1, она возвращает таблицу в качестве параметра out.Иногда процедура 2 может вызываться более одного раза.Вопрос в том, как объединить (или добавить) все, что я получил от процедуры 2, в одну таблицу?

Тип таблицы определяется пользователем:

CREATE OR REPLACE TYPE t_record AS OBJECT
(
  i         NUMBER,
  city_name VARCHAR2(100)
);

create or replace type t_table as table of t_record;

Я знаю о MULTISET UNION ALL,но кажется невозможным его использовать, поскольку я не знаю, сколько раз процедура 2 будет вызываться в процедуре 1.

Что мне делать?Может быть, все, что я делаю, неправильно, и есть лучший способ сделать это.Я буду рад услышать любые предложения.

FOR @ hotfix

Я упростил код процедуры 1. Она фактически вызывает процедуру 2 внутри цикла и после цикла.

FOR insurance_program IN insurance_programs LOOP
    IF insurance_program.level_of_service = 'additional' THEN
        Procedure2(client_id, 2, insurance_program.program_id, avaliable_cities);
    END IF; 
END LOOP; 

Procedure2(client_id, 1, 1, avaliable_cities); 

1 Ответ

1 голос
/ 17 мая 2019

Используйте MULTISET UNION ALL, чтобы добавить его в массив, который вы возвращаете:

CREATE PROCEDURE Procedure1(
  client_id        IN  NUMBER,
  available_cities OUT t_table
)
IS
  program_available_cities t_table;

  -- Dummy cursor with 3 rows.
  CURSOR insurance_programs IS
    SELECT LEVEL AS program_id,
           'additional' AS level_of_service
    FROM   DUAL
    CONNECT BY LEVEL <= 3;
BEGIN
  available_cities := t_table();

  FOR insurance_program IN insurance_programs LOOP
    IF insurance_program.level_of_service = 'additional' THEN
      Procedure2( client_id, 2, insurance_program.program_id, program_available_cities );
      available_cities := available_cities MULTISET UNION ALL program_available_cities;
    END IF; 
  END LOOP;
END;
/

Пример

CREATE OR REPLACE TYPE t_record AS OBJECT
(
  i         NUMBER,
  city_name VARCHAR2(100)
);

create or replace type t_table as table of t_record;

-- Dummy procedure to output 4 cities every time it is called
CREATE PROCEDURE Procedure2(
  client_id  IN NUMBER,
  variable1  IN NUMBER,
  program_id IN NUMBER,
  available_cities OUT t_table
)
IS
BEGIN
  available_cities := t_table();
  available_cities.EXTEND(4);
  FOR i IN 1 .. 4 LOOP

    available_cities(i) := t_record(
                             4 * program_id + i - 4,
                             'City' || TO_CHAR( 4 * program_id + i - 4 )
                           );
  END LOOP;
END;
/

DECLARE
  available_cities t_table;
BEGIN
  Procedure1( 1, available_cities );
  FOR i in 1 .. available_cities.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE( available_cities(i).i || ': ' || available_cities(i).city_name );
  END LOOP;
END;
/

выход :

1: City1
2: City2
3: City3
4: City4
5: City5
6: City6
7: City7
8: City8
9: City9
10: City10
11: City11
12: City12

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...