Функция не перезапускает запрос в курсоре - PullRequest
0 голосов
/ 16 марта 2020

У меня есть курсор, который проходит через несколько записей. Для каждой строки в возврате мне нужно проверить, существует ли она в возврате из другой функции. Моя проблема в том, что, даже если функции установлены на 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() возвращает список записей из схемы1, которые не соответствуют заданным правилам сопоставления. Если запись в курсоре не совпадает, то она вставляется в БД. Если следующая запись совпадает, она должна быть , а не в возвращаемой функции. Но поскольку non_matching_records() запускается только в первый раз, соответствующие строки возвращаются как не соответствующие.

...