【问题标题】:Creating a string array of insert queries in Postgres stored procedure and executing them在 Postgres 存储过程中创建插入查询的字符串数组并执行它们
【发布时间】:2019-07-02 11:27:27
【问题描述】:

我需要构造一个包含所有插入查询的字符串数组,其中动态值在游标上迭代。

过程如下:

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')}

等等。该数组应使用记录数据来构造查询。 最后,我想执行这个查询字符串。有没有办法做到这一点?我无法在遍历游标时更新表,因为它会影响已经存在的数据。

【问题讨论】:

  • 您当然可以创建一个数组并执行每个字符串,但我不明白您为什么需要这样做。事实上,我认为根本不需要这个功能。为什么不在常规 SQL 中完成所有这些工作?它会快得多。
  • @Jeremy 我没有故意提到该功能的整个业务逻辑。在高层次上,它实际上是一个 cron 作业,用于根据某些场景从表中插入和删除冗余数据
  • 好的,但除非列或表名是通过程序确定的,否则您不需要这样的函数。一条 SQL 语句可以同时执行插入和删除操作,您不必担心在迭代时修改表。
  • @Jeremy 目前我需要添加查询并执行它们的方法。如果你能帮我解决这个问题就太好了

标签: sql postgresql stored-procedures stored-functions


【解决方案1】:

如果使用函数array_append(anyarray, anyelement) 向数组查询字符串添加元素?

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

【讨论】:

  • 我在使用这个 ERROR: function array_append(character varying[], unknown, character varying) 不存在 LINE 1: SELECT array_append(querystring,'into...
  • 函数array_append(anyarray, anyelement)只有两个参数例如:select array_append(ARRAY[1,2], 3);
  • 您做错了什么,您可以查看有关此功能的文档,请查看:postgresql.org/docs/10/functions-array.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2018-03-09
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多