能否在AWS Redshift中像Oracle PL/SQL那样创建运行匿名块?
核心结论
AWS Redshift 不支持 Oracle PL/SQL 形式的、无需创建持久化对象即可直接运行的匿名代码块,这是你执行语句报syntax error at or near "record"错误的根本原因。
你所写的record类型游标、FOR LOOP遍历、块内EXECUTE动态执行都属于PL/SQL/PLpgSQL的过程化块语法,Redshift的SQL引擎只有在解析存储过程、用户自定义函数的定义时,才会识别这类语法,直接裸跑DECLARE...BEGIN...END结构会直接报语法错误。
不创建存储过程/函数的替代实现方案
不需要强行适配匿名块语法,要实现遍历表执行动态SQL的需求,可以用下面两种不在库内创建持久化对象的方案:
- 批量生成目标SQL后手动执行
直接查询系统视图拼接出所有需要运行的语句,无需写循环逻辑:
查询结果就是每一张表对应的行数统计SQL,复制所有查询结果直接执行,就能拿到和你原逻辑一致的输出。SELECT 'SELECT '''||table_schema||'.'||table_name||''' AS table_name, COUNT(*) FROM '||table_schema||'.'||table_name||';' FROM svv_tables -- 按需加过滤条件,比如排除系统表、指定目标schema WHERE table_schema NOT IN ('pg_catalog', 'information_schema'); - 借助客户端/外层脚本实现循环
用你连接Redshift的客户端脚本功能(比如DataGrip/DBeaver的变量循环、psql的元命令能力),或者Python、Shell等外层编程语言,先查出所有目标表名,在客户端侧循环拼接SQL发送给Redshift执行,全程不需要在Redshift库内创建任何存储过程、函数。
补充说明:你原代码中循环内的
commit没有实际意义,SELECT属于只读操作,不需要提交事务。
内容的提问来源于stack exchange,提问作者D_Tiwari
相关产品推荐
相关产品推荐

