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

时间:2018-09-03 14:38:16

标签: postgresql

我正在使用PostgreSQL 10.5,并且具有以下SQL:

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;

会引发以下错误:

ERROR: syntax error at or near "FOR" Position: 3

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

2 个答案:

答案 0 :(得分:4)

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

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';

答案 1 :(得分:0)

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

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的任务可能会有用。