首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免postgresql中的FOR循环出现语法错误?

如何避免postgresql中的FOR循环出现语法错误?
EN

Stack Overflow用户
提问于 2018-09-03 22:38:16
回答 2查看 1.3K关注 0票数 1

我使用的是SQL10.5,我有以下PostgreSQL:

代码语言:javascript
复制
FOR temprow IN
    SELECT o.objectid, o.nametag, cor.userseqno, cor.commseqno
    FROM "commuserobjectrights" as cor
    LEFT JOIN "object" as o ON cor.objectid = o.objectid
    WHERE o.nametag LIKE 'commission.video_questions'
LOOP
    INSERT INTO u commuserobjectrights (objectid, commseqno, userseqno, access) 
    VALUES (temprow.objectid, temprow.commseqno, temprow.userseqno, TRUE);
END LOOP;

这将抛出以下错误:

代码语言:javascript
复制
ERROR: syntax error at or near "FOR" Position: 3

我以前从未使用过循环,但根据文档,postgresql应该支持这些类型的循环。是的,我已经一遍又一遍地检查了所有的表名和列名是否拼写正确。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-03 22:40:37

您不能在过程代码之外使用FOR循环。但是,一般而言,Postgres (和SQL)已经进行了优化,可以执行基于集合的操作。因此,您可以将其表述为INSERT INTO ... SELECT

代码语言:javascript
复制
INSERT INTO commuserobjectrights (objectid, commseqno, userseqno, access)
SELECT o.objectid, o.nametag, cor.userseqno, TRUE
FROM "commuserobjectrights" as cor
LEFT JOIN "object" as o ON cor.objectid = o.objectid
WHERE o.nametag LIKE 'commission.video_questions';
票数 4
EN

Stack Overflow用户

发布于 2018-09-04 07:03:58

FOR是过程代码,您不需要使用DO或在存储代码中使用它。

代码语言:javascript
复制
DO $$ 
DECLARE
  temprow record ;
BEGIN 
  FOR temprow IN
    SELECT o.objectid, o.nametag, cor.userseqno, cor.commseqno
    FROM "commuserobjectrights" as cor
    LEFT JOIN "object" as o ON cor.objectid = o.objectid
    WHERE o.nametag LIKE 'commission.video_questions'
  LOOP
    INSERT INTO commuserobjectrights (objectid, commseqno, userseqno, access) 
    VALUES (temprow.objectid, temprow.commseqno, temprow.userseqno, TRUE);
  END LOOP;
END;
$$;

这不是完成此任务的最有效方法,但对于其他您不能轻松编写SQL的任务,do可能会很有用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52151855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档