You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL函数返回结果无法获取?pgAdmin 4测试问题求助

解决PostgreSQL游标函数在pgAdmin 4中无法获取数据的问题

可能的原因及修复方案

1. 执行方式问题(pgAdmin上下文)

在pgAdmin 4中,若将BEGIN;、函数调用、FETCH和COMMIT全部一次性执行,有时会因上下文未正确保留游标状态导致无法获取数据。正确的操作步骤是分步骤执行:

  • 先执行BEGIN;
  • 再执行SELECT running_order('productslist');
  • 接着执行FETCH ALL IN "productslist";
  • 最后执行COMMIT;

2. 函数返回类型冗余

你的第一个函数声明返回SETOF refcursor,但实际仅返回单个游标。虽然这不会报错,但更规范的写法是返回refcursor类型:

CREATE OR REPLACE FUNCTION running_order(ref1 refcursor) 
RETURNS refcursor AS $f$
BEGIN
  OPEN ref1 FOR SELECT * from stores;
  RETURN ref1;
END; 
$f$ LANGUAGE plpgsql;

3. 底层表无数据

先单独执行SELECT * FROM stores;确认stores表中是否存在数据。如果表为空,自然无法获取结果。

4. 第二个示例函数的适配

对于你提供的第二个测试函数,需将table_schema in ('makespace')替换为你数据库中存在的模式(比如public),否则会因找不到对应模式下的表而返回空结果:

CREATE OR REPLACE FUNCTION tablerows(ref1 refcursor)
RETURNS refcursor AS $$
BEGIN
OPEN ref1 FOR
WITH tbl AS
  (SELECT table_schema,
          TABLE_NAME
   FROM information_schema.tables
   WHERE TABLE_NAME not like 'pg_%'
     AND table_schema in ('public')) -- 替换为你的目标模式
SELECT table_schema,
       TABLE_NAME,
       (xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, TABLE_NAME), FALSE, TRUE, '')))[1]::text::int AS rows_n
FROM tbl
ORDER BY rows_n DESC;
RETURN ref1;
END; $$ LANGUAGE plpgsql;

执行时同样需分步骤运行BEGIN;、函数调用、FETCH和COMMIT。

内容的提问来源于stack exchange,提问作者Duncan Groenewald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:01:05