linkend="libpq-PQexecPrepared"/>. This feature allows
commands to be executed repeatedly without being parsed and
planned each time; see <xref linkend="sql-prepare"/> for details.
</para>
<para>
The function creates a prepared statement named
<parameter>stmtName</parameter> from the <parameter>query</parameter> string, which
must contain a single SQL command. <parameter>stmtName</parameter> can be
<literal>""</literal> to create an unnamed statement, in which case any
pre-existing unnamed statement is automatically replaced; otherwise
it is an error if the statement name is already defined in the
current session. If any parameters are used, they are referred
to in the query as <literal>$1</literal>, <literal>$2</literal>, etc.
<parameter>nParams</parameter> is the number of parameters for which types
are pre-specified in the array <parameter>paramTypes[]</parameter>. (The
array pointer can be <symbol>NULL</symbol> when
<parameter>nParams</parameter> is zero.) <parameter>paramTypes[]</parameter>
specifies, by OID, the data types to be assigned to the parameter
symbols. If <parameter>paramTypes</parameter> is <symbol>NULL</symbol>,
or any particular element in the array is zero, the server assigns
a data type to the parameter symbol in the same way it would do
for an untyped literal string. Also, the query can use parameter
symbols with numbers higher than <parameter>nParams</parameter>; data types
will be inferred for these symbols as well. (See
<xref linkend="libpq-PQdescribePrepared"/> for a means to find out
what data types were inferred.)
</para>
<para>
As with <xref linkend="libpq-PQexec"/>, the result is normally a
<structname>PGresult</structname> object whose contents indicate
server-side success or failure. A null result indicates
out-of-memory or inability to send the command at all. Use
<xref linkend="libpq-PQerrorMessage"/> to get more information about
such errors.
</para>
</listitem>
</varlistentry>
</variablelist>
Prepared statements for use with <xref linkend="libpq-PQexecPrepared"/> can also
be created by executing SQL <xref linkend="sql-prepare"/>
statements.
</para>
<para>
<variablelist>
<varlistentry id="libpq-PQexecPrepared">
<term><function>PQexecPrepared</function><indexterm><primary>PQexecPrepared</primary></indexterm></term>
<listitem>
<para>
Sends a request to execute a prepared statement with given
parameters, and waits for the result.
<synopsis>
PGresult *PQexecPrepared(PGconn *conn,
const char *stmtName,
int nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
</synopsis>
</para>
<para>
<xref linkend="libpq-PQexecPrepared"/> is like <xref linkend="libpq-PQexecParams"/>,
but the command to be executed is specified by naming a
previously-prepared statement, instead of giving a query string.
This feature allows commands that will be used repeatedly to be
parsed and planned just once, rather than each time they are
executed. The statement must have been prepared previously in
the current session.
</para>
<para>
The parameters are identical to <xref linkend="libpq-PQexecParams"/>, except that the
name of a prepared statement is given instead of a query string, and the
<parameter>paramTypes[]</parameter> parameter is not present (it is not needed since
the prepared statement's parameter types were determined when it was created).