函数未在游标中重新运行查询

时间:2020-03-16 09:36:32

标签: postgresql database-cursor

我有一个游标遍历许多记录。对于返回中的每一行,我需要检查另一个函数的返回中是否存在。我的问题是,即使将函数设置为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()仅是第一次运行,所以匹配的行返回为不匹配。

0 个答案:

没有答案