PostgreSQL:如何在refcursor中使用变量指定列获取数据?
解决PostgreSQL动态列游标查询问题
你的问题核心是没有将字符串形式的列名解析为实际查询列,而是直接返回了字符串本身。要实现动态选择指定列并通过游标返回结果,需要使用PostgreSQL的动态SQL功能,具体修改如下:
修改后的函数代码
CREATE OR REPLACE FUNCTION public.find_n(vref_cursor refcursor) RETURNS refcursor AS $$ DECLARE namess text; dynamic_sql text; BEGIN -- 获取排除id和salary后的列名列表 SELECT STRING_AGG(column_name, ',') INTO namess FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'company' AND column_name NOT IN ('id', 'salary'); -- 构造动态SQL语句 dynamic_sql := format('SELECT %s FROM company', namess); -- 打开游标执行动态SQL OPEN vref_cursor FOR EXECUTE dynamic_sql; RETURN vref_cursor; END; $$ LANGUAGE plpgsql;
关键修改说明
- 构造动态SQL:使用
format()函数安全拼接SQL语句,避免SQL注入风险(即使列名来自系统表,也建议保持这个安全习惯)。 - EXECUTE执行动态SQL:
OPEN ... FOR EXECUTE语法允许将动态生成的SQL语句作为游标查询的数据源,PostgreSQL会解析namess中的列名,返回对应列的实际数据。
调用方式不变
依然使用原来的事务调用流程:
BEGIN; SELECT public.find_n('vref_cursor'); FETCH ALL IN vref_cursor; COMMIT;
这样就能返回SELECT name, age, address, join_date FROM public.company的实际查询结果,而非重复的字符串值。
内容的提问来源于stack exchange,提问作者AB21
相关产品推荐
相关产品推荐

