Iterar por meio dos registros de uma consulta

Usando um tipo especial de loop FOR, é possível iterar por meio dos resultados de uma consulta e manipular esses dados. A sintaxe de loop FOR IN é a seguinte:
[<<label>>]
FOR record | row IN select_clause LOOP
   statements
END LOOP;
O registro ou linha tem todas as linhas que resultam da cláusula select designadas e o corpo de loop é executado para cada uma. Segue o exemplo:
DECLARE
    mviews RECORD;
    -- Instead, if you did:
    -- mviews cs_materialized_views%ROWTYPE;
    -- this record is ONLY usable for the cs_materialized_views table
BEGIN
    CALL cs_log('Refreshing materialized views...');
    FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP
    -- Now "mviews" has one record from cs_materialized_views
        RAISE EXCEPTION, 'Can't execute SQL while processing SQL for %',
        mview.my_name;
    END LOOP;
    CALL cs_log('Done refreshing materialized views.');
    return 1;
end;

Se o loop for finalizado com uma instrução EXIT, a última linha designada ainda estará acessível após o loop.

A instrução FOR-IN EXECUTE é outra maneira de iterar sobre registros:

[<<label>>]
FOR record | row IN EXECUTE text_expression LOOP
    statements
END LOOP;

Esse formato é semelhante ao formato anterior, exceto que a instrução SELECT de origem ser especificada como uma expressão de sequência. A principal diferença entre os dois é a sintaxe e o uso de variáveis para construir o SQL a ser executado. A primeira forma é mais rápida para avaliar.