sql - 在 Postgres 存储过程中创建插入查询的字符串数组并执行它们
问题描述
我需要构造一个包含所有插入查询的字符串数组,其中动态值在游标上进行迭代。
该过程如下所示:
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')}
等等。该数组应使用记录数据来构造查询。最后,我想执行这个查询字符串。有没有办法做到这一点?我无法在遍历游标时更新表,因为它会影响已经存在的数据。
解决方案
如果您使用函数 array_append(anyarray, anyelement) 将元素添加到数组查询字符串?
querystring:=array_append(querystring,'insert...');
推荐阅读
- ios - 任务调度 iOS
- dart - 如何为飞镖设置 VS Code
- android - 当我在 android 的 termux 上尝试 tsudo npm install 时出现错误代码 enosys 和 err number 38
- sql - 使 Oracle 表列可为空并将默认值设置为 NULL
- java-8 - 使用选项重写 if else 空检查
- java - 如何通过 application.properties 注入日期值
- python - 如何在 Jenkins 中为每个构建自动更改文件名(结果存储为 pickle 文件)?阅读以下内容以了解有关该问题的更多信息
- android - 未在 Android Studio 中获取改造请求和响应的日志
- c++ - Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- java - 如何完成数组问题,它总是重复