Du kan inte komma åt en CTE utanför hela uttalandet. Och du kan inte komma åt enskilda delar av en CTE utanför den slutliga SELECT för en CTE.
Du måste lägga hela CTE (inklusive den sista SELECT-satsen) in markörslingan:
FOR R IN (WITH TMP1 AS (.....),
TMP2 AS (......),
TMP3 AS (......)
SELECT DISTINCT .....
FROM TMP1
JOIN temp2 ON ...
JOIN temp3 ON ...
WHERE .....)
LOOP
-- here goes the code that processes each row of the query
END LOOP;