输入对象数组作为输入,return 数组作为存储过程的输出
Input array of objects as input and return an array as output from Stored Procedure
我有一个要求,我需要将嵌套的对象数组作为输入传递给存储过程,从 table 获取数据作为不同日期范围的组,并且 return 所有日期范围数据作为输出。我是 PL/Sql 的新手,所以在这里请求您的指导。
我已经阅读了很多关于实现这一点的文章,但我只了解了存储过程和 pl/sql 的基本概念,但我无法实现这种情况。
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;
程序:
select 来自 test_data
table 的简单过程,并将日期范围收集到输出参数中,其中行的 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
db<>fiddle here
我有一个要求,我需要将嵌套的对象数组作为输入传递给存储过程,从 table 获取数据作为不同日期范围的组,并且 return 所有日期范围数据作为输出。我是 PL/Sql 的新手,所以在这里请求您的指导。
我已经阅读了很多关于实现这一点的文章,但我只了解了存储过程和 pl/sql 的基本概念,但我无法实现这种情况。
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;
程序:
select 来自 test_data
table 的简单过程,并将日期范围收集到输出参数中,其中行的 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
db<>fiddle here