Что заставляет этот WHILE L OOP in Postgres выдавать ошибку? - PullRequest
0 голосов
/ 13 января 2020

Мой запрос на вставку множества строк с небольшими изменениями данных. Используя временную таблицу, я могу приблизить пользовательские переменные, но когда я добавляю l oop, я получаю эту ошибку:

ОШИБКА: синтаксическая ошибка в или около "WHILE"

Пожалуйста, помогите с синтаксисом :

-- SQL User Variables in temp table

        create temporary table foo as select 1108 as udocid, CAST('2018-01-01' as date)as uctime, CAST('2018-01-15'as date)as umtime,'Study1108' as udocname, 'xlsx' as udoctype, 'C:\2018Studies\Data' as udocpath;
     --Here is the erroring WHILE condition:   
        WHILE foo.udocid < 1110  LOOP

         INSERT INTO documents(docid,ctime,mtime,docname,doctype,docpath) SELECT udocid,uctime,umtime,udocname,udoctype,udocpath from foo;
         UPDATE foo SET udocid = udocid +1, uctime = (uctime + INTERVAL '1 day'), umtime = (uctime + INTERVAL '15 day'), udocname = CONCAT('Study', udocid),udocpath = CONCAT('C:\','2018Studies\','Data');

         -- loop inserts a row then updates the variables for the next row;
        END LOOP;
        -- clean up 
        drop table foo;

1 Ответ

1 голос
/ 13 января 2020

Потому что нет while в SQL. Если вам это нужно, вам нужно использовать PL / pg SQL

Но вам не нужен al oop или даже временная таблица для этого в Postgres. Postgres имеет удобную функцию generate_series(), которую можно использовать, чтобы делать то, что вы хотите.

INSERT INTO documents(docid, ctime, mtime, docname, doctype, docpath) 
SELECT t.id + 1108, 
       date '2018-01-01' + t.id, 
       DATE '2018-01-15' + t.id * 15, 
       'Study'||to_char(1108 + t.id, 'FM99999'), 
       'xlsx', 
       'C:\2018Studies\Data'
from generate_series(0, 2) as t(id)
...