如何检查 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 上有很多例子可以说明为什么。
如何检查 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 上有很多例子可以说明为什么。