【问题标题】:Oracle stored procedure to return rowset as out parameterOracle 存储过程将行集作为输出参数返回
【发布时间】:2019-07-12 06:09:16
【问题描述】:

我需要一些关于我需要从 Oracle 存储过程返回表结构的过程的帮助。

我的要求如下:

  1. 我的项目将有一个从外部系统调用的主程序
  2. 该过程将从内部调用多个函数,这些函数将返回一个值。喜欢 Function_1 返回 10Function_2 返回 20
  3. 现在收到这个值后,我需要将数据作为 KEY VALUE 结构返回给过程的调用方法。喜欢

    KEY        | VALUE
    -----------+-----------
    Function_1 |  10
    Function_2 |  20
    

我的限制是我不能创建一个临时表来实现这个功能。所以,我看到了一个带有 ref cursor 的选项,但是如何用这个值填充光标。

提前致谢。

【问题讨论】:

  • 请提供minimal reproducible example,包括您的表的 DDL 语句以及您创建过程的尝试以及任何错误消息或不符合您要求的说明。
  • 程序不是我写的。寻找方法来做到这一点。所以,如果你能提供任何有用的例子。

标签: oracle stored-procedures plsql


【解决方案1】:

您可以使用流水线函数(而不是过程):

Oracle 设置

CREATE TYPE KeyValuePair AS Object(
  key   VARCHAR2(20),
  value NUMBER(8)
);
/
CREATE TYPE KeyValuePairList AS TABLE OF KeyValuePair;
/
CREATE FUNCTION function1 RETURN NUMBER AS BEGIN RETURN 10; END;
/
CREATE FUNCTION function2 RETURN NUMBER AS BEGIN RETURN 20; END;
/

CREATE FUNCTION mainFunc RETURN KeyValuePairList PIPELINED
AS
BEGIN
  PIPE ROW ( KeyValuePair( 'FUNCTION1', function1() ) );
  PIPE ROW ( KeyValuePair( 'FUNCTION2', function2() ) );
END;
/

查询

SELECT *
FROM   TABLE( mainFunc() );

输出

关键 |价值 :-------- | ----: 功能1 | 10 功能2 | 20

db小提琴here


或者作为一个程序:

CREATE PROCEDURE mainFunc (
  o_cursor OUT SYS_REFCURSOR
)
AS
BEGIN
  OPEN o_cursor FOR
    SELECT 'FUNCTION1'  AS key, function1() AS value FROM DUAL UNION ALL
    SELECT 'FUNCTION2'  AS key, function2() AS value FROM DUAL;
END;
/

db小提琴here

【讨论】:

  • 我们可以将'mainFunc()'作为过程吗?也有许多线程调用 maninFunc()。所以,会有任何并发​​问题。只是为了好奇-有什么方法可以通过光标来做到这一点
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多