Я надеюсь, что документация чистая.
FETCH извлекает следующую строку из курсора в цель, которая может быть переменной строки, переменной записи или списком простых переменных, разделенных запятыми, подобно SELECT INTO. Если следующей строки нет, цель устанавливается в NULL. Как и в случае SELECT INTO, можно проверить специальную переменную FOUND, чтобы узнать, получена строка или нет.
Таким образом, вы не можете использовать временную таблицу в качестве цели. Используйте переменную record, если нет особых требований:
DECLARE
r record;
mycursor refcursor;
BEGIN
OPEN mycursor ..
LOOP
FETCH mycursor INTO r;
EXIST WHEN NOT FOUND;
RAISE NOTICE 'personid: %', r.personid;
Для этой простой задачи лучше использовать оператор FOR IN SELECT
.
DECLARE r record;
BEGIN
FOR r IN SELECT p.personid, ...
LOOP
RAISE NOTICE 'personid: %', r.personid;