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
相关产品推荐
相关产品推荐

