PL/pgSQL函数中FOR SELECT循环如何正确传递参数?
解决PL/pgSQL函数参数传递无结果的问题
核心问题分析
你的函数返回空结果的根本原因是循环内的SELECT语句硬编码了查询条件,完全没用到传入的参数。代码里的参数写法只是注释备注,并未替换掉字面量'A5'和'TD',所以无论你传什么参数,查询的都是固定值,和你调用时传入的'DT'不匹配,自然查不到数据。
正确的参数传递写法
修改函数内的WHERE条件,直接使用函数参数名(PL/pgSQL函数内部可直接引用参数名,无需加冒号或$1/$2):
CREATE OR REPLACE FUNCTION archive_kasudr__dds.f_get_soap1(p_sel_id varchar, p_sel_dt varchar) RETURNS text LANGUAGE plpgsql VOLATILE AS $$ declare p_sel_id_a ALIAS FOR p_sel_id; -- 别名可选,可直接替代参数名使用 p_sel_dt_a ALIAS FOR p_sel_dt; rez text:=''; temprow RECORD; var_result text; begin FOR temprow IN SELECT attr_id, low_val, high_val FROM archive_kasudr__dds.tunes WHERE sel_id = p_sel_id and -- 直接使用参数名 sel_dt = p_sel_dt and -- 直接使用参数名 clause = 'W' and dim_id = 'SOAP' ORDER BY sel_num LOOP rez = rez || temprow.low_val; IF temprow.attr_id = 'VAR' then -- 若动态SQL需引用函数参数,必须用USING子句传递,避免SQL注入 -- 示例:EXECUTE temprow.high_val INTO var_result USING p_sel_id, p_sel_dt; EXECUTE temprow.high_val into var_result; rez = rez || var_result; END IF; END LOOP; RETURN rez; END; $$ EXECUTE ON ANY;
其他参数写法说明
- 位置参数:替换条件为
sel_id = $1和sel_dt = $2,效果与直接用参数名一致。 - 别名参数:用定义好的别名替代参数名,比如
sel_id = p_sel_id_a,同样有效。 - 动态SQL注意:如果
EXECUTE执行的SQL需要用到函数参数,绝对不能直接拼接字符串,必须通过USING子句传递,既防止SQL注入,也能保证参数类型匹配。
测试调用
现在传入对应参数就能得到预期结果:
select archive_kasudr__dds.f_get_soap1('A5', 'DT');
内容的提问来源于stack exchange,提问作者Babo
相关产品推荐
相关产品推荐

