我有一个像这样的.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
我无法判断这是否是一个范围问题,因为匿名阻止,以及为什么它试图将我的变量视为列。有什么想法吗?
答案 0 :(得分:2)
根据手册DO
执行一个匿名代码块:
...被视为没有参数的函数体,返回void。它被解析并执行一次......
因此它是一个返回VOID
的函数。从这个意义上讲,prev_count
仅存在于第一个DO
。
为避免这种情况,您可以创建一个TEMP表并在prev_count
中插入DO
,以便在事务的任何位置使用它。