prepared state.
</para>
</listitem>
</varlistentry>
<varlistentry id="ecpg-transactions-exec-sql-autocommit-on">
<term><literal>EXEC SQL SET AUTOCOMMIT TO ON</literal></term>
<listitem>
<para>
Enable autocommit mode.
</para>
</listitem>
</varlistentry>
<varlistentry id="ecpg-transactions-exec-sql-autocommit-off">
<term><literal>EXEC SQL SET AUTOCOMMIT TO OFF</literal></term>
<listitem>
<para>
Disable autocommit mode. This is the default.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect2>
<sect2 id="ecpg-prepared">
<title>Prepared Statements</title>
<para>
When the values to be passed to an SQL statement are not known at
compile time, or the same statement is going to be used many
times, then prepared statements can be useful.
</para>
<para>
The statement is prepared using the
command <literal>PREPARE</literal>. For the values that are not
known yet, use the
placeholder <quote><literal>?</literal></quote>:
<programlisting>
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
</programlisting>
</para>
<para>
If a statement returns a single row, the application can
call <literal>EXECUTE</literal> after
<literal>PREPARE</literal> to execute the statement, supplying the
actual values for the placeholders with a <literal>USING</literal>
clause:
<programlisting>
EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;
</programlisting>
</para>
<para>
If a statement returns multiple rows, the application can use a
cursor declared based on the prepared statement. To bind input
parameters, the cursor must be opened with
a <literal>USING</literal> clause:
<programlisting>
EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?";
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1;
/* when end of result set reached, break out of while loop */
EXEC SQL WHENEVER NOT FOUND DO BREAK;
EXEC SQL OPEN foo_bar USING 100;
...
while (1)
{
EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname;
...
}
EXEC SQL CLOSE foo_bar;
</programlisting>
</para>
<para>
When you don't need the prepared statement anymore, you should
deallocate it:
<programlisting>
EXEC SQL DEALLOCATE PREPARE <replaceable>name</replaceable>;
</programlisting>
</para>
<para>
For more details about <literal>PREPARE</literal>,
see <xref linkend="ecpg-sql-prepare"/>. Also
see <xref linkend="ecpg-dynamic"/> for more details about using
placeholders and input parameters.
</para>
</sect2>
</sect1>
<sect1 id="ecpg-variables">
<title>Using Host Variables</title>
<para>
In <xref linkend="ecpg-commands"/> you saw how you can execute SQL
statements from an embedded SQL program. Some of those statements
only used fixed values and did not provide a way to insert
user-supplied values into statements or have the program process
the values returned by the query. Those kinds of statements are
not really useful in real applications. This section explains in
detail how you can pass data between your C program and the
embedded SQL statements using a simple mechanism called
<firstterm>host variables</firstterm>. In an embedded SQL program we
consider the SQL statements to be <firstterm>guests</firstterm> in the C
program code which is the <firstterm>host language</firstterm>. Therefore
the variables of the C program are called <firstterm>host
variables</firstterm>.
</para>
<para>
Another way to exchange values between PostgreSQL backends and ECPG
applications is the use of SQL descriptors, described
in <xref linkend="ecpg-descriptors"/>.
</para>
<sect2 id="ecpg-variables-overview">
<title>Overview</title>
<para>
Passing data between the C program and the SQL statements is
particularly simple