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

能否在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后手动执行
    直接查询系统视图拼接出所有需要运行的语句,无需写循环逻辑:
    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');
    
    查询结果就是每一张表对应的行数统计SQL,复制所有查询结果直接执行,就能拿到和你原逻辑一致的输出。
  • 借助客户端/外层脚本实现循环
    用你连接Redshift的客户端脚本功能(比如DataGrip/DBeaver的变量循环、psql的元命令能力),或者Python、Shell等外层编程语言,先查出所有目标表名,在客户端侧循环拼接SQL发送给Redshift执行,全程不需要在Redshift库内创建任何存储过程、函数。

补充说明:你原代码中循环内的commit没有实际意义,SELECT属于只读操作,不需要提交事务。

内容的提问来源于stack exchange,提问作者D_Tiwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:12:18