如何在不声明返回列的情况下获取动态查询的结果集?
解决方案:动态查询结果集的获取(无需预声明返回列)
在PostgreSQL中,DO匿名块无法返回查询结果,这是你当前代码无法获取结果的核心原因。要实现不声明返回列的动态查询结果返回,你需要改用PL/pgSQL函数,结合RETURNS SETOF record来实现。
步骤1:创建动态查询函数
直接将你的查询逻辑封装到函数中,利用RETURN QUERY EXECUTE返回动态结果:
CREATE OR REPLACE FUNCTION get_dynamic_json_result() RETURNS SETOF record AS $$ DECLARE query_text text; BEGIN query_text := ' SELECT obj->>''objectsourceeid'' AS datatag, MAX(CASE WHEN (obj->>''objectclasstitle'') = ''area'' THEN obj->>''objectclassid'' END) AS area_objectclasstitle, MAX(CASE WHEN (obj->>''objectclasstitle'') = ''area'' THEN (obj->>''objectinstanceproperty'')::JSONB->>''objectinstanceproperty'' END) AS area_objectinstance FROM TEMP_JSON_DATA, jsonb_array_elements(data::JSONB) AS obj GROUP BY datatag; '; RETURN QUERY EXECUTE query_text; END; $$ LANGUAGE plpgsql;
步骤2:调用函数并指定结果结构
因为函数返回的是无固定结构的record,调用时需要明确指定列名和对应类型:
SELECT * FROM get_dynamic_json_result() AS ( datatag text, area_objectclasstitle text, area_objectinstance text );
原代码失效原因
DO块是匿名过程,执行后不会向客户端返回任何结果集,即使内部包含SELECT语句也不会输出。- 原代码中临时表的创建、查询、删除逻辑完全在
DO块内部执行,结果无法传递到外部。
额外优化:省略临时表
你可以跳过临时表的创建,直接动态执行查询并返回结果,逻辑更简洁高效。
内容的提问来源于stack exchange,提问作者K N
相关产品推荐
相关产品推荐

