PostgreSQL同一存储过程执行多查询并遍历schema取数如何实现?
PostgreSQL 跨schema查询person表的实现方案
完整实现代码
以下基于PL/pgSQL编写,直接返回schema、name两列的结果集:
CREATE OR REPLACE FUNCTION get_myschema_persons() RETURNS TABLE ( schema text, name text ) LANGUAGE plpgsql STABLE AS $$ DECLARE current_schema text; BEGIN -- 遍历所有前缀为myschema_的schema FOR current_schema IN SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'myschema_%' LOOP -- 动态查询对应schema下的person表,自动处理转义避免SQL注入 RETURN QUERY EXECUTE format( 'SELECT %L, name FROM %I.person', current_schema, current_schema ); END LOOP; RETURN; END; $$;
调用方式
执行以下查询即可获得符合格式要求的结果:
SELECT * FROM get_myschema_persons();
兼容优化说明
- 代码使用
format函数的%I标识符占位符、%L字符串占位符自动处理转义,避免SQL注入风险,同时兼容带特殊字符的schema名称 - 如果部分
myschema_前缀的schema下不存在person表,默认执行会抛出异常。如果需要跳过无person表的schema,可修改循环逻辑增加存在性判断:
LOOP -- 先校验person表是否存在 IF EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = current_schema AND table_name = 'person' ) THEN RETURN QUERY EXECUTE format( 'SELECT %L, name FROM %I.person', current_schema, current_schema ); END IF; END LOOP;
- 如果你需要使用
PROCEDURE语法而非函数实现,可通过返回refcursor的方式输出结果,函数实现的调用方式更简单,更适合直接获取结果集的场景。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

