| The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide
by The PostgreSQL Global Development Group Paperback (6"x9"), 478 pages ISBN 9781906966065 RRP £14.95 ($19.95) Sales of this book support the PostgreSQL project! Get a printed copy>>> |
9.6.4 Looping Through Query Results
Using a different type of FOR loop, you can iterate through
the results of a query and manipulate that data
accordingly. The syntax is:
[ <<label>> ]
FOR target IN query LOOP
statements
END LOOP [ label ];
The target is a record variable, row variable, or comma-separated list of scalar variables. The target is successively assigned each row resulting from the query and the loop body is executed for each row. Here is an example:
CREATE FUNCTION cs_refresh_mviews() RETURNS integer AS $$
DECLARE
mviews RECORD;
BEGIN
PERFORM 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
PERFORM cs_log('Refreshing materialized view '
|| quote_ident(mviews.mv_name) || ' ...');
EXECUTE 'TRUNCATE TABLE ' || quote_ident(mviews.mv_name);
EXECUTE 'INSERT INTO '
|| quote_ident(mviews.mv_name) || ' '
|| mviews.mv_query;
END LOOP;
PERFORM cs_log('Done refreshing materialized views.');
RETURN 1;
END;
$$ LANGUAGE plpgsql;
If the loop is terminated by an EXIT statement, the last
assigned row value is still accessible after the loop.
The query used in this type of FOR
statement can be any SQL command that returns rows to the caller:
SELECT is the most common case,
but you can also use INSERT, UPDATE, or
DELETE with a RETURNING clause. Some utility
commands such as EXPLAIN will work too.
PL/pgSQL variables are substituted into the query text, and the query plan is cached for possible re-use, as discussed in detail in section 9.10.1 Variable Substitution and section 9.10.2 Plan Caching.
The FOR-IN-EXECUTE statement is another way to iterate over
rows:
[ <<label>> ]
FOR target IN EXECUTE text_expression [ USING expression [,
... ] ] LOOP
statements
END LOOP [ label ];
This is like the previous form, except that the source query
is specified as a string expression, which is evaluated and replanned
on each entry to the FOR loop. This allows the programmer to
choose the speed of a preplanned query or the flexibility of a dynamic
query, just as with a plain EXECUTE statement.
As with EXECUTE, parameter values can be inserted
into the dynamic command via USING.
Another way to specify the query whose results should be iterated through is to declare it as a cursor. This is described in section 9.7.4 Looping Through a Cursor's Result.
| ISBN 9781906966065 | The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide | See the print edition |