<command>FETCH FORWARD</command> with
a positive count. For simple queries
<productname>PostgreSQL</productname> will allow backwards fetch
from cursors not declared with <literal>SCROLL</literal>, but this
behavior is best not relied on. If the cursor is declared with
<literal>NO SCROLL</literal>, no backward fetches are allowed.
</para>
<para>
<literal>ABSOLUTE</literal> fetches are not any faster than
navigating to the desired row with a relative move: the underlying
implementation must traverse all the intermediate rows anyway.
Negative absolute fetches are even worse: the query must be read to
the end to find the last row, and then traversed backward from
there. However, rewinding to the start of the query (as with
<literal>FETCH ABSOLUTE 0</literal>) is fast.
</para>
<para>
<link linkend="sql-declare"><command>DECLARE</command></link>
is used to define a cursor. Use
<link linkend="sql-move"><command>MOVE</command></link>
to change cursor position without retrieving data.
</para>
</refsect1>
<refsect1>
<title>Examples</title>
<para>
The following example traverses a table using a cursor:
<programlisting>
BEGIN WORK;
-- Set up a cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;
-- Fetch the first 5 rows in the cursor liahona:
FETCH FORWARD 5 FROM liahona;
code | title | did | date_prod | kind | len
-------+-------------------------+-----+------------+----------+-------
BL101 | The Third Man | 101 | 1949-12-23 | Drama | 01:44
BL102 | The African Queen | 101 | 1951-08-11 | Romantic | 01:43
JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
P_302 | Becket | 103 | 1964-02-03 | Drama | 02:28
-- Fetch the previous row:
FETCH PRIOR FROM liahona;
code | title | did | date_prod | kind | len
-------+---------+-----+------------+--------+-------
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
-- Close the cursor and end the transaction:
CLOSE liahona;
COMMIT WORK;
</programlisting></para>
</refsect1>
<refsect1>
<title>Compatibility</title>
<para>
The SQL standard defines <command>FETCH</command> for use in
embedded SQL only. The variant of <command>FETCH</command>
described here returns the data as if it were a
<command>SELECT</command> result rather than placing it in host
variables. Other than this point, <command>FETCH</command> is
fully upward-compatible with the SQL standard.
</para>
<para>
The <command>FETCH</command> forms involving
<literal>FORWARD</literal> and <literal>BACKWARD</literal>, as well
as the forms <literal>FETCH <replaceable
class="parameter">count</replaceable></literal> and <literal>FETCH
ALL</literal>, in which <literal>FORWARD</literal> is implicit, are
<productname>PostgreSQL</productname> extensions.
</para>
<para>
The SQL standard allows only <literal>FROM</literal> preceding the cursor
name; the option to use <literal>IN</literal>, or to leave them out altogether, is
an extension.
</para>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member><xref linkend="sql-close"/></member>
<member><xref linkend="sql-declare"/></member>
<member><xref linkend="sql-move"/></member>
</simplelist>
</refsect1>
</refentry>