输入对象数组作为输入并返回一个数组作为存储过程的输出

Posted

技术标签:

【中文标题】输入对象数组作为输入并返回一个数组作为存储过程的输出【英文标题】:Input array of objects as input and return an array as output from Stored Procedure 【发布时间】:2019-10-07 12:20:43 【问题描述】:

我有一个要求,我需要将嵌套的对象数组作为输入传递给存储过程,从表中获取数据作为不同日期范围的组,并将所有日期范围数据作为输出返回。我是 PL/Sql 的新手,所以在这里请求您的指导。

我已经阅读了很多关于实现这一点的文章,但我只知道存储过程和 pl/sql 的基本概念,但我无法实现这个场景。

【问题讨论】:

【参考方案1】:

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;
/

输出:

19 年 1 月 1 日 - 19 年 1 月 2 日 19 年 1 月 3 日 - 19 年 1 月 4 日 19 年 1 月 4 日 - 19 年 1 月 5 日

db小提琴here

【讨论】:

以上是关于输入对象数组作为输入并返回一个数组作为存储过程的输出的主要内容,如果未能解决你的问题,请参考以下文章

我是不是使用数组作为输入?我犯了啥逻辑错误?

在 ASP.net 中运行时调用存储过程

映射输入数组并获取过滤后的对象数组作为结果

使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程

ruby 练习:计算数组totalWrite一个方法总计,它将一个数字数组作为输入并返回它们的总和(总和)。

ruby 练习:计算数字数组的中位数写一个方法中位数,它取一个数字数组作为输入并返回