在PgAdmin中如何正确调用已创建的PostgreSQL动态SQL函数?
问题排查与修正
你现有代码和调用存在以下错误:
- 函数名不匹配:你定义的函数名为
functions.search_function,调用时写的searchandfilter2_function和定义完全不一致,是触发报错的直接原因 - 参数被重复定义覆盖:入参已经声明了
_columns text,你又在DECLARE块里重新定义了同名变量并赋值固定字符串,会导致你传入的自定义参数完全失效 - 字段名笔误:DECLARE块里给
_columns的默认值写的subject_timetime::text多了一个time后缀,和表字段、返回列的subject_time不匹配,执行会报字段不存在 - 多余的USING子句:你是把
_columns作为SQL片段直接拼接进语句,USING是用来传递查询值的,此处完全不需要,写了也不会生效 - 调用参数无效:你调用时传入的
'students'不符合参数要求,该参数需要传入和返回结构后三列匹配的字段拼接SQL片段,否则拼接后SQL会语法报错
修正后的函数代码
CREATE OR REPLACE FUNCTION functions.search_function(_columns text DEFAULT 'student_id::text, subject_time::text, building::text') RETURNS TABLE( student text, student_id text, professor_name text, subject text, subject_time text, room_number text, building text ) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY EXECUTE ' SELECT student, professor_name, subject, room_number, ' || _columns || ' FROM "school_records_table"'; END $func$;
这里把默认列配置移到了入参声明处,去掉了重复变量定义、多余USING子句,修正了字段笔误。
正确调用方式
注意:函数RETURNS TABLE固定了7个返回列的顺序和类型,你传入的_columns参数对应的三个列,必须和返回结构的后三列student_id、subject_time、building的顺序、数量、类型完全匹配,否则会执行报错。
-- 调用方式1:使用默认配置的列查询 SELECT * FROM functions.search_function(); -- 调用方式2:传入自定义列查询(示例和默认配置一致,可按需调整为符合要求的字段拼接) SELECT * FROM functions.search_function('student_id::text, subject_time::text, building::text');
内容的提问来源于stack exchange,提问作者driedbananas
相关产品推荐
相关产品推荐

