gpt4 book ai didi

postgresql - 使用先前 DO 子句中的变量

转载 作者:行者123 更新时间:2023-11-29 14:32:02 25 4
gpt4 key购买 nike

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

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

最佳答案

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

... is treated as though it were the body of a function with no parameters, returning void. It is parsed and executed a single time...

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

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

关于postgresql - 使用先前 DO 子句中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com