如何在Amazon Redshift中实现简单的循环插入操作?
修正后的PL/pgSQL存储过程代码
CREATE PROCEDURE cs_refresh_reports() LANGUAGE plpgsql AS $$ DECLARE last_nps RECORD; BEGIN FOR last_nps IN SELECT "date" FROM table_1 LOOP INSERT INTO table_2 ("value") SELECT "value" FROM table_3 WHERE "date" = last_nps."date"; END LOOP; END; $$;
原代码的错误解析
- 循环语法错误:
FOR last_nps IN SELECT "date" FROM table_1 ;末尾多了分号,PL/pgSQL中FOR循环的查询语句后直接接LOOP,不需要加分号。 - 误用动态SQL:这里不需要用
EXECUTE执行动态SQL,你的逻辑是固定的,直接写普通INSERT语句即可,动态SQL只适合需要动态拼接SQL的场景。 - Record字段引用错误:访问
RECORD类型变量的字段,必须用变量名.字段名的形式(即last_nps."date"),:last_nps是动态SQL里的绑定变量写法,这里不适用。 - 冗余的RETURN语句:无返回值的PROCEDURE可以省略
RETURN;,保留也不影响,但完全没必要。
更高效的实现方式
其实这个逻辑完全不需要循环,用一条关联查询的INSERT语句就能完成,效率比逐行循环高很多:
CREATE PROCEDURE cs_refresh_reports() LANGUAGE plpgsql AS $$ BEGIN INSERT INTO table_2 ("value") SELECT t3."value" FROM table_3 t3 INNER JOIN table_1 t1 ON t3."date" = t1."date"; END; $$;
内容的提问来源于stack exchange,提问作者Dávid Mészáros
相关产品推荐
相关产品推荐

