<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.oci-execute" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>oci_execute</refname>
  <refpurpose>Executes a statement</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>bool</type><methodname>oci_execute</methodname>
   <methodparam><type>resource</type><parameter>statement</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>mode</parameter><initializer><constant>OCI_COMMIT_ON_SUCCESS</constant></initializer></methodparam>
  </methodsynopsis>
  <para>
   Executes a <parameter>statement</parameter> previously returned
   from <function>oci_parse</function>.
  </para>
  <para>
   After execution, statements like <literal>INSERT</literal> will
   have data committed to the database by default.  For statements
   like <literal>SELECT</literal>, execution performs the logic of the
   query. Query results can subsequently be fetched in PHP with
   functions like <function>oci_fetch_array</function>.
  </para>
  <para>
   Each parsed statement may be executed multiple times, saving the
   cost of re-parsing.  This is commonly used
   for <literal>INSERT</literal> statements when data is bound
   with <function>oci_bind_by_name</function>.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>statement</parameter></term>
     <listitem>
      <para>
       A valid OCI statement identifier.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>mode</parameter></term>
     <listitem>
      <para>
        An optional second parameter can be one of the following constants:
       <table>
        <title>Execution Modes</title>
        <tgroup cols="2">
         <thead>
          <row>
           <entry>Constant</entry>
           <entry>Description</entry>
          </row>
         </thead>
         <tbody>
          <row>
           <entry><constant>OCI_COMMIT_ON_SUCCESS</constant></entry>
           <entry>Automatically commit all outstanding changes for
             this connection when the statement has succeeded. This
             is the default.</entry>
          </row>
          <row>
           <entry><constant>OCI_DESCRIBE_ONLY</constant></entry>
           <entry>Make query meta data available to functions
             like <function>oci_field_name</function> but do not
             create a result set. Any subsequent fetch call such
             as <function>oci_fetch_array</function> will
             fail.</entry>
          </row>
          <row>
           <entry><constant>OCI_NO_AUTO_COMMIT</constant></entry>
           <entry>Do not automatically commit changes.</entry>
          </row>
         </tbody>
        </tgroup>
       </table>
      </para>
      <para>
       Using <constant>OCI_NO_AUTO_COMMIT</constant> mode starts or continues a
       transaction. Transactions are automatically rolled back when
       the connection is closed, or when the script ends.  Explicitly
       call <function>oci_commit</function> to commit a transaction,
       or <function>oci_rollback</function> to abort it.
      </para>
      <para>
       When inserting or updating data, using transactions is
       recommended for relational data consistency and for performance
       reasons.
      </para>
      <para>
       If <constant>OCI_NO_AUTO_COMMIT</constant> mode is used for any
       statement including queries, and 
        <function>oci_commit</function>
       or <function>oci_rollback</function> is not subsequently
       called, then OCI8 will perform a rollback at the end of the
       script even if no data was changed.  To avoid an unnecessary
       rollback, many scripts do not
       use <constant>OCI_NO_AUTO_COMMIT</constant> mode for queries or
       PL/SQL.  Be careful to ensure the appropriate transactional
       consistency for the application when
       using <function>oci_execute</function> with different modes in
       the same script.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &return.success;
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title><function>oci_execute</function> for queries</title>
    <programlisting role="php">
<![CDATA[
<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title><function>oci_execute</function> without specifying a mode example</title>
    <programlisting role="php">
<![CDATA[
<?php

// Before running, create the table:
//   CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (123)');

oci_execute($stid); // The row is committed and immediately visible to other users

?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title><function>oci_execute</function> with <constant>OCI_NO_AUTO_COMMIT</constant> example</title>
    <programlisting role="php">
<![CDATA[
<?php

// Before running, create the table:
//   CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (:bv)');
oci_bind_by_name($stid, ':bv', $i, 10);
for ($i = 1; $i <= 5; ++$i) {
    oci_execute($stid, OCI_NO_AUTO_COMMIT);
}
oci_commit($conn);  // commits all new values: 1, 2, 3, 4, 5

?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title><function>oci_execute</function> with different commit modes example</title>
    <programlisting role="php">
<![CDATA[
<?php

// Before running, create the table:
//   CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (123)');
oci_execute($stid, OCI_NO_AUTO_COMMIT);  // data not committed

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (456)');
oci_execute($stid);  // commits both 123 and 456 values

?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title><function>oci_execute</function> with
     <constant>OCI_DESCRIBE_ONLY</constant> example</title>
    <programlisting role="php">
<![CDATA[
<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM locations');
oci_execute($s, OCI_DESCRIBE_ONLY);
for ($i = 1; $i <= oci_num_fields($stid); ++$i) {
    echo oci_field_name($stid, $i) . "<br>\n";
}

?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>

 <refsect1 role="notes">
  &reftitle.notes;
  <note>
   <para>
    Transactions are automatically rolled back when connections are
    closed, or when the script ends, whichever is soonest.  Explicitly
    call <function>oci_commit</function> to commit a transaction.
   </para>
   <para>
    Any call to <function>oci_execute</function> that uses
    <constant>OCI_COMMIT_ON_SUCCESS</constant> mode explicitly or by
    default will commit any previous uncommitted transaction.
   </para>
   <para>
    Any Oracle DDL statement such as <literal>CREATE</literal>
    or <literal>DROP</literal> will automatically commit any
    uncommitted transaction.
   </para>
  </note>
  <note>
   <para>
    Because the <function>oci_execute</function> function generally
    sends the statement to the
    database, <function>oci_execute</function> can identify some
    statement syntax errors that the lightweight,
    local <function>oci_parse</function> function does not.
   </para>
  </note>
 </refsect1>

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>oci_parse</function></member>
   </simplelist>
  </para>
 </refsect1>

</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
