Amazon Redshift存储过程WHILE循环报错:integer附近语法错误
Amazon Redshift存储过程WHILE循环语法错误排查与修复
以下是你代码中的关键错误点及修正方案:
变量声明与赋值错误
- DECLARE块中变量声明结尾缺少分号,且PL/pgSQL标准赋值运算符为
:=,需将I INTEGER =1改为I INTEGER := 1; - 输入参数
REC_COUNT默认是IN类型无法修改,不能直接用SET赋值,需重新声明内部变量,通过SELECT ... INTO获取统计结果:v_rec_count INTEGER; BEGIN SELECT COUNT(*) INTO v_rec_count FROM ods_epremis.new_old_merge;
- DECLARE块中变量声明结尾缺少分号,且PL/pgSQL标准赋值运算符为
语句结尾缺少分号
所有PL/pgSQL语句(INSERT、赋值语句等)结尾必须加;,比如:insert into targettable (select * from MERGE_RECORD);I := I + 1;
JOIN别名未定义
MERGE_RECORD中的JOIN语句未给表指定别名,导致T1_accountno=T2_accountno无意义,需补充别名:SELECT * from ods_epremis.new_old_merge AS T1 JOIN FIRST_RECORD AS T2 ON T1.accountno = T2.accountno拼写错误
order by clain_oid应为order by claim_oid(字段名拼写错误)LANGUANGE plpgsql应为LANGUAGE plpgsql(关键字拼写错误)
循环逻辑问题
原逻辑每次循环取TOP1 claim_oid但未更新筛选条件,会导致重复插入相同数据,需调整为按顺序处理不同的claim_oid
修正后的完整代码:
create or replace procedure WHILE_COM() AS $$ DECLARE I INTEGER := 1; v_rec_count INTEGER; v_current_claim_oid VARCHAR; -- 请根据实际字段类型调整 BEGIN -- 获取总记录数 SELECT COUNT(*) INTO v_rec_count FROM ods_epremis.new_old_merge; WHILE I <= v_rec_count LOOP -- 按顺序获取第I条记录的claim_oid SELECT claim_oid INTO v_current_claim_oid FROM ( SELECT claim_oid, ROW_NUMBER() OVER (ORDER BY claim_oid) AS rn FROM ods_epremis.new_old_merge ) t WHERE rn = I; WITH FIRST_RECORD AS ( SELECT * FROM ods_epremis.new_old_merge WHERE claim_oid = v_current_claim_oid ), MERGE_RECORD AS ( SELECT T1.* -- 建议指定具体字段,避免重复字段冲突 FROM ods_epremis.new_old_merge AS T1 JOIN FIRST_RECORD AS T2 ON T1.accountno = T2.accountno ) INSERT INTO targettable SELECT * FROM MERGE_RECORD; I := I + 1; END LOOP; END; $$ LANGUAGE plpgsql;
说明:
- 移除原输入参数,改为内部查询获取总记录数
- 新增
v_current_claim_oid变量,确保每次循环处理不同的claim_oid - 用ROW_NUMBER按顺序获取目标记录,避免重复插入
- 修正所有语法错误与拼写问题
内容的提问来源于stack exchange,提问作者Sumit Gupta
相关产品推荐
相关产品推荐

