【问题标题】:How to return a table along with 2 varchar values from a Postgres function如何从 Postgres 函数返回一个表以及 2 个 varchar 值
【发布时间】:2021-05-21 15:25:49
【问题描述】:

目前正在将 Oracle 数据库迁移到 Postgres,我遇到了一个被卡住的用例。 在 Oracle 中,我有一个返回 3 个值的过程

  1. SELECT 查询的结果集(这是一个 Oracle ref_cursor)
  2. 一条消息
  3. 一种状态

这是Oracle中的过程

CREATE OR REPLACE PROCEDURE ORA_TEST (
        I_EMP_ACTIVE IN VARCHAR2,
        O_RESULTSET OUT SYS_REFCURSOR
        O_MESSAGE OUT VARCHAR2
        O_STATUS OUT VARCHAR2)
AS
        V_COUNT NUMBER;
BEGIN
        SELECT COUNT(*) INTO V_COUNT FROM EMPLOYEE WHERE EMP_ACTIVE=I_EMP_ACTIVE;
                IF V_COUNT>0
                        OPEN O_RESULTSET FOR SELECT * FROM EMPLOYEE WHERE EMP_ACTIVE=I_EMP_ACTIVE;
                        O_STATUS := 'SUCCESS';
                        O_MESSAGE := 'Search Results found';
                ELSE
                        O_STATUS := 'FAILURE';
                        O_MESSAGE := 'No Search Results found';
                END IF;
END;

现在,当我尝试在 Postgres 中将此过程创建为函数时,我可以将结果集作为 TABLE 或 SETOF RECORD 返回,但我无法将 O_MESSAGE 和 O_STATUS 与结果集一起返回。

请注意,我无法使用 Postgres ref_cursor 返回结果集(这是因为我们在从 API 访问 ref_cursor 时遇到了一些问题,这就是我们使用 TABLE、SETOF RECORD 或 SETOF TYPE 返回结果集的原因)。

是否有任何方法可以实现这种类型的结果集(使用 TABLE 以及 2 个 varchar 列)?

【问题讨论】:

  • 函数和过程是两个不同的东西。 函数应该返回单个值,并在某种情况下将该单个值分配给某物。
  • 是的,我明白这一点,但有什么方法可以获得所需的输出吗?我对函数或过程没有任何问题,但 AFAIK Postgres 过程不能将复杂数据类型的记录集作为 OUT 参数

标签: postgresql oracle


【解决方案1】:

您可以像下面这样转换它...(我不确定它是否可以与您的 API 一起使用...)

create or replace function ORA_TEST(I_EMP_ACTIVE varchar) 
returns table(O_RESULTSET refcursor, O_MESSAGE varchar, O_STATUS varchar) as

$$
declare
V_COUNT int;
ref refcursor := 'mycursor';
begin
SELECT COUNT(*) INTO V_COUNT FROM EMPLOYEE WHERE EMP_ACTIVE=I_EMP_ACTIVE;
                IF V_COUNT>0 then 
                        OPEN ref FOR SELECT * FROM EMPLOYEE WHERE EMP_ACTIVE=I_EMP_ACTIVE;
                        O_STATUS := 'SUCCESS';
                        O_MESSAGE := 'Search Results found';
                ELSE
                        O_STATUS := 'FAILURE';
                        O_MESSAGE := 'No Search Results found';
                END IF;
                
return query

select ref, O_STATUS, O_MESSAGE;

end;
$$
language plpgsql;

并像下面这样称呼它:

BEGIN;
select * from ora_test('1');
FETCH ALL from "mycursor";
COMMIT;

DEMO

【讨论】:

  • 是的,这符合我的目的。唯一的问题是我无法在 Postgres 中使用 refcursor,因为 API 端存在驱动程序限制,并且他们无法以正确的格式获取结果集。由于这个原因,我需要使用 TABLE、SETOF RECORD 或 SETOF TYPE 来返回结果集。
  • AFAIK 在 postgres 中是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多