aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/plpgsql.sgml34
1 files changed, 26 insertions, 8 deletions
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 562dfad728e..59ec377ea9d 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.113 2007/07/14 23:02:25 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.114 2007/07/15 00:45:16 tgl Exp $ -->
<chapter id="plpgsql">
<title><application>PL/pgSQL</application> - <acronym>SQL</acronym> Procedural Language</title>
@@ -1757,7 +1757,7 @@ END LOOP;
</para>
</sect3>
- <sect3>
+ <sect3 id="plpgsql-integer-for">
<title><literal>FOR</> (integer variant)</title>
<synopsis>
@@ -1777,7 +1777,8 @@ END LOOP <optional> <replaceable>label</replaceable> </optional>;
the lower and upper bound of the range are evaluated once when entering
the loop. If the <literal>BY</> clause isn't specified the iteration
step is 1, otherwise it's the value specified in the <literal>BY</>
- clause. If <literal>REVERSE</> is specified then the step value is
+ clause, which again is evaluated once on loop entry.
+ If <literal>REVERSE</> is specified then the step value is
subtracted, rather than added, after each iteration.
</para>
@@ -1785,17 +1786,15 @@ END LOOP <optional> <replaceable>label</replaceable> </optional>;
Some examples of integer <literal>FOR</> loops:
<programlisting>
FOR i IN 1..10 LOOP
- -- some computations here
- RAISE NOTICE 'i is %', i;
+ -- i will take on the values 1,2,3,4,5,6,7,8,9,10 within the loop
END LOOP;
FOR i IN REVERSE 10..1 LOOP
- -- some computations here
+ -- i will take on the values 10,9,8,7,6,5,4,3,2,1 within the loop
END LOOP;
FOR i IN REVERSE 10..1 BY 2 LOOP
- -- some computations here
- RAISE NOTICE 'i is %', i;
+ -- i will take on the values 10,8,6,4,2 within the loop
END LOOP;
</programlisting>
</para>
@@ -1805,6 +1804,13 @@ END LOOP;
in the <literal>REVERSE</> case), the loop body is not
executed at all. No error is raised.
</para>
+
+ <para>
+ If a <replaceable>label</replaceable> is attached to the
+ <literal>FOR</> loop then the integer loop variable can be
+ referenced with a qualified name, using that
+ <replaceable>label</replaceable>.
+ </para>
</sect3>
</sect2>
@@ -3654,6 +3660,18 @@ a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
</para>
</listitem>
+ <listitem>
+ <para>
+ Integer <command>FOR</> loops with <literal>REVERSE</> work
+ differently: <application>PL/SQL</> counts down from the second
+ number to the first, while <application>PL/pgSQL</> counts down
+ from the first number to the second, requiring the loop bounds
+ to be swapped when porting. This incompatibility is unfortunate
+ but is unlikely to be changed. (See <xref
+ linkend="plpgsql-integer-for">.)
+ </para>
+ </listitem>
+
</itemizedlist>
</para>