如何在PostgreSQL中更新内部的源表以进行循环主体
我有一个表格,我要迭代循环,并且在试图更新for循环中的源表数据时,它没有反映。在下面的示例中,我希望Rasie通知语句应执行5次,但仅执行3次。
DO $$
DECLARE p_Id int;
BEGIN
DROP TABLE IF EXISTS TempTbl;
CREATE TEMPORARY TABLE TempTbl (Id int);
INSERT INTO TempTbl VALUES (1);
INSERT INTO TempTbl VALUES (2);
INSERT INTO TempTbl VALUES (3);
FOR p_Id in SELECT * FROM TempTbl
LOOP
RAISE NOTICE 'Value of p_Id: %', p_Id;
INSERT INTO TempTbl
SELECT 4
WHERE 4 NOT IN (SELECT Id FROM TempTbl);
INSERT INTO TempTbl
SELECT 5
WHERE 5 NOT IN (SELECT Id FROM TempTbl);
END LOOP;
END $$;
当前输出
NOTICE: Value of p_Id: 1
NOTICE: Value of p_Id: 2
NOTICE: Value of p_Id: 3
预期输出
NOTICE: Value of p_Id: 1
NOTICE: Value of p_Id: 2
NOTICE: Value of p_Id: 3
NOTICE: Value of p_Id: 4
NOTICE: Value of p_Id: 5
注意:我将从前3行中检索值4和5(即,我无法插入全部开始时的值)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
循环似乎是基于误解。无论哪种方式,这都是它的工作方式:
避免
不在(选择...)
中,除非您确切知道自己在做什么。请参阅:并避免使用骆驼标识符。请参阅:
The loop seems to be based on a misunderstanding. Either way, this is how it could work:
Avoid
NOT IN (SELECT ...)
unless you know exactly what you are doing. See:And avoid CaMeL-case identifiers. See: