Создание строкового массива запросов на вставку в хранимой процедуре Postgres и их выполнение - PullRequest
0 голосов
/ 02 июля 2019

У меня есть требование для создания массива строк из всех запросов вставки с динамическими значениями, перебираемыми курсором.

Процедура выглядит следующим образом:

CREATE OR REPLACE FUNCTION get_data()
 RETURNS void AS $$
DECLARE
    interval_time INTEGER DEFAULT 0;
    rec_old   RECORD;
    rec_new   RECORD;
    rec_start RECORD;
    v_filename VARCHAR(50);
    querystring TEXT[];

    cursor_file CURSOR FOR
        select distinct(filename) from mytable.tableA;
    cursor_data CURSOR FOR
            select * from mytable.tableA where filename = v_filename order by mindatetime, maxdatetime;
BEGIN
    --open the file cursor
    OPEN cursor_file;
        LOOP
        FETCH cursor_file into v_filename;
        EXIT WHEN NOT FOUND;

            -- Open the second cursor
               OPEN cursor_data;
               FETCH cursor_data INTO rec_old;
               rec_start = rec_old;
               LOOP
                -- fetch each record
                  FETCH cursor_data INTO rec_new;
                      interval_time :=   extract(epoch from rec_new.mindatetime) * 1000 - extract(epoch from rec_old.maxdatetime) * 1000;
                      IF interval_time = 1  THEN
                        -- swap the new and old rec


                        querystring='{insert into mytable.tableA values ('rec_new.fileid,rec_new.systemuid,rec_new.filename,rec_new.mindatetime,rec_new.maxdatetime')}';
                        raise notice 'query is %', querystring;
                        rec_old = rec_new;
                      ELSE
                        -- insert new records to other table
                        RAISE NOTICE 'Values to insert: %, % ', rec_start.mindatetime, rec_old.maxdatetime;


                      END IF;
                      -- exit when no more row to fetch
                      EXIT WHEN NOT FOUND;
               END LOOP;

               -- Close the cursor
               CLOSE cursor_data;

        END LOOP;
    CLOSE cursor_file;
END; $$
LANGUAGE plpgsql;

Мне нужномассив строк должен быть таким:

{insert into mytable.tableA values ('123','dummyfilenameA','2019-04-21 03:06:26.0','2019-04-28 03:06:26.0'),
insert into mytable.tableA values ('456','dummyfilenameB','2019-05-21 03:06:26.0','2019-05-28 03:06:26.0')}

и так далее.Массив должен использовать данные записей для построения запроса.Наконец, я хочу выполнить эту строку запроса.Есть ли способ сделать это?Я не могу обновить таблицу при переборе курсоров, поскольку это влияет на уже имеющиеся данные.

1 Ответ

0 голосов
/ 03 июля 2019

если вы используете функцию array_append (anyarray, anyelement) для добавления элементов в строку запроса массива?

querystring:=array_append(querystring,'insert...');
...