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