如何检查 ref 游标是否指向 postgres 中的空结果集

How do I check if a ref cursor points to empty result set in postgres

如何检查 ref 游标是否指向 postgres 中的空结果集。

我已将引用游标变量设置为空,但是当我 运行 一个 returns 引用游标的函数时,它 运行 在结果集为空时永远存在。这是 postgres 错误吗?

下面是代码

function_1 returns 一个引用游标

begin;
  select * from function_1(11::bigint) as result;
  fetch all from "test";
end;
create or replace function_1( In status_id bigint,OUT r_ref refcursor)
AS

Begin
 r_ref:="test";

      if select count(*) from table_1 > 1 then 

       open r_ref for select * from table_1;

      else
           r_ref:=null;
      end if;

return;
end;
$$language plpgsql;

让我们从头说起。您声明了一个函数,但确实声明了一个 return 类型;一个函数必须声明一个 return 类型,而且这没有被定义为一个 OUT 参数。其次,作为一个引用游标,它不能被赋值语句设置。这使得语句 r_ref:="test"; 成为无效语句,更不用说变量“test”未定义(参见文档 Identifiers and Keywords

There is a second kind of identifier: the delimited identifier or quoted identifier. It is formed by enclosing an arbitrary sequence of characters in double-quotes ("). A delimited identifier is always an identifier ...

最后,结构if (select ...)无效。要获得计数,您需要提供一个变量来保存它,然后 select 进入该变量:

create or replace function_1( In status_id bigint)
   return refcursor
 language plpgsql 
as $$
declare 
    v_cnt integer;
    r_ref refcursor;
begin
    select count(*)
      into v_cnt 
      from table_1; 

    if v_cnt > 0 then 
       open r_ref for 
            select * from table_1;
    else
       open r_ref for 
            select * from table_1 where 0=1; -- this returns no rows but gives in the appropriate suructure
    end if;

    return r_ref;   
end;
$$; 

不需要 status_id 参数,但假设它是大型函数的一部分,我将其保留。但是,请小心。这似乎是一个 table 列名称,如果是这样,您可能不应该将它用作参数名称。 SO 上有很多例子可以说明为什么。