can be inserted into the dynamic command via
<literal>format()</literal> and <literal>USING</literal>.
The <literal>SCROLL</literal> and
<literal>NO SCROLL</literal> options have the same meanings as for a bound
cursor.
</para>
<para>
An example:
<programlisting>
OPEN curs1 FOR EXECUTE format('SELECT * FROM %I WHERE col1 = $1',tabname) USING keyvalue;
</programlisting>
In this example, the table name is inserted into the query via
<function>format()</function>. The comparison value for <literal>col1</literal>
is inserted via a <literal>USING</literal> parameter, so it needs
no quoting.
</para>
</sect3>
<sect3 id="plpgsql-open-bound-cursor">
<title>Opening a Bound Cursor</title>
<synopsis>
OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replaceable>argument_name</replaceable> { := | => } </optional> <replaceable>argument_value</replaceable> <optional>, ...</optional> ) </optional>;
</synopsis>
<para>
This form of <command>OPEN</command> is used to open a cursor
variable whose query was bound to it when it was declared. The
cursor cannot be open already. A list of actual argument value
expressions must appear if and only if the cursor was declared to
take arguments. These values will be substituted in the query.
</para>
<para>
The query plan for a bound cursor is always considered cacheable;
there is no equivalent of <command>EXECUTE</command> in this case.
Notice that <literal>SCROLL</literal> and <literal>NO SCROLL</literal> cannot be
specified in <command>OPEN</command>, as the cursor's scrolling
behavior was already determined.
</para>
<para>
Argument values can be passed using either <firstterm>positional</firstterm>
or <firstterm>named</firstterm> notation. In positional
notation, all arguments are specified in order. In named notation,
each argument's name is specified using <literal>:=</literal>
or <literal>=></literal> to
separate it from the argument expression. Similar to calling
functions, described in <xref linkend="sql-syntax-calling-funcs"/>, it
is also allowed to mix positional and named notation.
</para>
<para>
Examples (these use the cursor declaration examples above):
<programlisting>
OPEN curs2;
OPEN curs3(42);
OPEN curs3(key := 42);
OPEN curs3(key => 42);
</programlisting>
</para>
<para>
Because variable substitution is done on a bound cursor's query,
there are really two ways to pass values into the cursor: either
with an explicit argument to <command>OPEN</command>, or implicitly by
referencing a <application>PL/pgSQL</application> variable in the query.
However, only variables declared before the bound cursor was
declared will be substituted into it. In either case the value to
be passed is determined at the time of the <command>OPEN</command>.
For example, another way to get the same effect as the
<literal>curs3</literal> example above is
<programlisting>
DECLARE
key integer;
curs4 CURSOR FOR SELECT * FROM tenk1 WHERE unique1 = key;
BEGIN
key := 42;
OPEN curs4;
</programlisting>
</para>
</sect3>
</sect2>
<sect2 id="plpgsql-cursor-using">
<title>Using Cursors</title>
<para>
Once a cursor has been opened, it can be manipulated with the
statements described here.
</para>
<para>
These manipulations need not occur in the same function that
opened the cursor to begin with. You can return a <type>refcursor</type>
value out of a function and let the caller operate on the cursor.
(Internally, a <type>refcursor</type>