Iterare i record di una query

Utilizzando un tipo speciale di ciclo FOR, è possibile iterare i risultati di una query e manipolare i dati. La sintassi del ciclo FOR IN è la seguente:
[<<label>>]
FOR record | row IN select_clause LOOP
   statements
END LOOP;
Al record o alla riga vengono assegnate tutte le righe risultanti dalla clausola select e il corpo del ciclo viene eseguito per ciascuna di esse. Segue un esempio:
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 il ciclo viene terminato con un'istruzione EXIT, l'ultima riga assegnata è ancora accessibile dopo il ciclo.

L'istruzione FOR-IN EXECUTE è un altro modo per iterare i record:

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

Questa forma è simile alla precedente, tranne per il fatto che l'istruzione SELECT di origine è specificata come espressione di stringa. La differenza principale tra i due è la sintassi e l'uso delle variabili per costruire l'SQL da eseguire. La prima forma è più veloce da valutare.