Redshift存储过程执行报错:record 'list'无'table_name'字段求助
解决Amazon Redshift存储过程错误:record "list" has no field "table_name"
错误原因分析
- 存储过程代码存在语法结构不完整问题:你粘贴的代码中,
END LOOP;之后的END;和$$;被放在了代码块外部,导致PL/pgSQL无法正确解析整个存储过程结构,进而无法识别RECORD变量list的字段。 - 动态SQL存在语法缺陷:Redshift要求FROM子句后的子查询必须指定别名,原代码中的子查询未设置别名,会触发语法错误。
- 冗余的赋值方式:使用
SELECT list.primary_key INTO keys;这类语句完全没必要,直接变量赋值更简洁且能避免潜在问题。
修正后的存储过程代码
CREATE OR replace PROCEDURE admin.sp_load_duplicate_data() language plpgsql AS $$ DECLARE list RECORD; keys varchar(2000); Table_name varchar(2000); query varchar(2000); BEGIN FOR list IN SELECT table_name, primary_key FROM admin.table_primary_keys LOOP -- 直接赋值替代冗余的SELECT INTO keys := list.primary_key; Table_name := list.table_name; -- 修复动态SQL:给子查询添加别名,保证语法合规 query := 'select ''' || Table_name || ''', count(1) from (select ' || keys || ', count(1) from ' || Table_name || ' group by ' || keys || ' having count(1) > 1) as sub_query'; -- 如需插入审计表,取消下方注释并确保audit.duplicate_table_list表存在 -- EXECUTE 'insert into audit.duplicate_table_list(table_name,count) ' || query; EXECUTE query; END LOOP; END; $$;
额外注意事项
- 确保
admin.table_primary_keys表的table_name字段存储带schema的完整表名(如admin.user_info),否则动态SQL可能找不到目标表。 - 如果
primary_key字段包含多列(如id,name),需确保列名分隔符正确,且目标表确实存在这些列。 - 执行存储过程前,确认当前用户拥有
admin.table_primary_keys的读取权限,以及目标表的查询权限。
内容的提问来源于stack exchange,提问作者Vedaraj Asirvatham
相关产品推荐
相关产品推荐

