使用先前DO子句中的变量

时间:2018-05-16 17:41:56

标签: postgresql plpgsql

我有一个像这样的.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 个答案:

答案 0 :(得分:2)

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

  

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

因此它是一个返回VOID的函数。从这个意义上讲,prev_count仅存在于第一个DO

为避免这种情况,您可以创建一个TEMP表并在prev_count中插入DO,以便在事务的任何位置使用它。