Ввести массив объектов в качестве входных данных и вернуть массив в качестве вывода из хранимой процедуры - PullRequest
0 голосов
/ 07 октября 2019

У меня есть требование, где мне нужно передать вложенный массив объектов в качестве входных данных для хранимой процедуры, получить данные из таблицы в виде группы различных диапазонов дат и вернуть все данные диапазонов дат в качестве выходных данных. Я новичок в PL / Sql, поэтому запросите ваше руководство здесь.

Я прошел много статей по достижению этого, но у меня есть только базовое представление о хранимых процедурах и pl / sql, но янедоступен для достижения этого сценария.

1 Ответ

0 голосов
/ 07 октября 2019

Настройка Oracle :

Создание коллекции для ввода:

CREATE TYPE intlist AS TABLE OF int;

Создание коллекции для вывода:

CREATE TYPE daterange AS OBJECT(
  start_date DATE,
  end_date   DATE
);
/
CREATE TYPE daterangelist AS TABLE OF daterange;

Создание некоторыхтестовые данные:

CREATE TABLE test_data ( id, start_date, end_date ) AS
  SELECT 1, DATE '2019-01-01', DATE '2019-01-02' FROM DUAL UNION ALL
  SELECT 2, DATE '2019-01-02', DATE '2019-01-03' FROM DUAL UNION ALL
  SELECT 3, DATE '2019-01-03', DATE '2019-01-04' FROM DUAL UNION ALL
  SELECT 4, DATE '2019-01-04', DATE '2019-01-05' FROM DUAL;

Процедура :

Простая процедура, которая выбирается из таблицы test_data и собирает диапазоны дат в выходной параметр, где строка имеетid это MEMBER OF входной массив.

CREATE PROCEDURE test_proc (
  i_ints  IN  intlist,
  o_dates OUT daterangelist
)
IS
BEGIN
  SELECT daterange( start_date, end_date )
  BULK COLLECT INTO o_dates
  FROM   test_data
  WHERE  id MEMBER OF i_ints;
END;
/

Тестирование :

DECLARE
  p_ranges daterangelist;
BEGIN
  test_proc( intlist( 1, 3, 4 ), p_ranges );
  FOR i IN 1 .. p_ranges.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE( p_ranges(i).start_date || ' - ' || p_ranges(i).end_date );
  END LOOP;
END;
/

Выходы:

01-JAN-19 - 02-JAN-19
03-JAN-19 - 04-JAN-19
04-JAN-19 - 05-JAN-19

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

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