Как избежать синтаксической ошибки в циклах FOR в postgresql? - PullRequest
0 голосов
/ 03 сентября 2018

Я использую 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 голосов
/ 04 сентября 2018

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, может быть полезным.

0 голосов
/ 03 сентября 2018

Нельзя использовать циклы 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...