代码之家  ›  专栏  ›  技术社区  ›  rxmnnxfpvg

使用前一DO子句中的变量

  •  0
  • rxmnnxfpvg  · 技术社区  · 6 年前

    我有一本书。sql脚本如下:

    DO $$
        DECLARE     
        prev_count := (SELECT count(*) FROM ...);
    END$$;
    
    UPDATE [...]
    
    DO $$
        DECLARE     
        cur_count := (SELECT count(*) FROM ...);
        BEGIN
        ASSERT cur_count = prev_count, 'Mismatch';
    END$$;
    

    在其中,我得到一些值,修改数据库,并期望新值与旧值匹配。但是,我会遇到如下错误:

    psql:migration.sql:163: ERROR:  column "prev_count" does not exist
    LINE 1: SELECT cur_count = prev_count
                                  ^
    QUERY:  SELECT cur_count = prev_count
    CONTEXT:  PL/pgSQL function inline_code_block line 4 at ASSERT
    

    我不知道这是否是一个范围问题,因为匿名块,以及为什么它试图像列一样对待我的变量。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dan    6 年前

    根据手册 DO 执行匿名代码块:

    。。。被视为没有参数的函数体,返回void。它被一次解析和执行。。。

    所以它是一个返回 VOID .从这个意义上说 prev_count 仅存在于第一个 .

    为了避免这种情况,可以创建一个临时表并插入 上一次计数 首先 因此,您可以在事务中的任何位置使用它。