PostgreSQL PL/pgSQL函数报错SQL Error [42601]:RETURN QUERY语法错误求助
问题排查与修复
核心问题分析
语法错误直接原因
循环内的动态SQL拼接语句'FROM ' _table_name缺少字符串连接操作符||,导致PostgreSQL无法解析完整的SQL语句,这就是报错提示“输入末尾语法错误”的根源。你单独执行时手动补全了表名,所以没触发这个问题,但函数里的字符串拼接必须用||连接所有部分。返回字段不匹配
函数定义返回table (table_name text, id int),但原动态SQL查询的是_column_name(日期类字段)和id,返回结果的列与函数定义的结构不符,后续执行仍会报错。SQL注入与标识符转义风险
直接拼接表名、列名这类标识符,若标识符包含空格、大写字母或关键字,会导致语法错误;同时存在SQL注入风险,需用quote_ident()函数做安全转义。
修正后的代码(按函数定义返回table_name和id)
DROP FUNCTION users_tables(); create or replace function users_tables() returns table (table_name text, id int) language plpgsql as $function$ declare _table_name text; _column_name text; begin for _table_name,_column_name in select distinct t.table_name, c2.column_name from information_schema.tables t inner join information_schema.columns c1 on c1.table_name = t.table_name and c1.table_schema = t.table_schema and c1.column_name = 'utilisateur_fk' inner join information_schema.columns c2 on c2.table_name = t.table_name and c2.table_schema = t.table_schema and lower(c2.column_name) like 'date%' order by t.table_name, c2.column_name limit 2 loop return QUERY execute 'SELECT ' || quote_ident(_table_name) || '::text, id FROM ' || quote_ident(_table_name); end loop; end $function$ ; select users_tables();
若需返回日期字段和id(调整函数返回定义)
DROP FUNCTION users_tables(); create or replace function users_tables() returns table (date_column text, id int) language plpgsql as $function$ declare _table_name text; _column_name text; begin for _table_name,_column_name in select distinct t.table_name, c2.column_name from information_schema.tables t inner join information_schema.columns c1 on c1.table_name = t.table_name and c1.table_schema = t.table_schema and c1.column_name = 'utilisateur_fk' inner join information_schema.columns c2 on c2.table_name = t.table_name and c2.table_schema = t.table_schema and lower(c2.column_name) like 'date%' order by t.table_name, c2.column_name limit 2 loop return QUERY execute 'SELECT ' || quote_ident(_column_name) || '::text, id FROM ' || quote_ident(_table_name); end loop; end $function$ ; select users_tables();
内容的提问来源于stack exchange,提问作者SOUE77
相关产品推荐
相关产品推荐

