You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:06:19