我有一个游标遍历许多记录。对于返回中的每一行,我需要检查另一个函数的返回中是否存在。我的问题是,即使将函数设置为VOLATILE
,该函数似乎也不会为游标中的每一行重新运行。
如何获取重新运行的功能以获取更新的信息?
-- Cursor declaration
-- returns a list of users that are duplicated in the staging table.
-- _cursor CURSOR FOR SELECT * from duplicated_records($1);
-- Cursor loop
FOR _record IN _cursor
LOOP
IF exists(SELECT id FROM non_matching_rows($1) WHERE id = _record.id) THEN
WITH
ins_users AS (
INSERT INTO schema1.users (title, forename, surname)
VALUES (_record.title, _record.first_name, _record.last_name)
RETURNING user_id
)
UPDATE schema2.users c
SET user_id = i.user_id
FROM ins_users i
WHERE c.id = _record.id;
END IF;
END LOOP;
我已经尝试了以上和IF _record.id IN(SELECT id from non_matching_rows($1))
都给出相同的结果。它似乎只运行一次non_matching_rows()
。看来是这样的,因为non_matching_row()
遍历不匹配的记录并根据预定义的规则插入。在所有条件下,只要姓氏或名字匹配,就插入记录。有了该插入,它们将匹配任何将来的记录并且不会被插入,因此为什么我需要针对游标中的每一行再次运行它。 non_matching_rows()
返回schema1中不符合预设匹配规则的记录列表。如果游标中的记录不匹配,则将其插入DB中。如果下一条记录匹配,则应该 not 在函数返回中。但是由于non_matching_records()
仅是第一次运行,所以匹配的行返回为不匹配。