php-doc-en/reference/oci8/functions/oci-execute.xml
2013-01-16 23:53:53 +00:00

312 lines
9 KiB
XML

<?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>OCI_COMMIT_ON_SUCCESS</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. Prior to PHP
5.3.2 (PECL OCI8 1.4)
use <constant>OCI_DEFAULT</constant> which is equivalent
to <constant>OCI_NO_AUTO_COMMIT</constant>.</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); // use OCI_DEFAULT for PHP <= 5.3.1
}
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>
<note>
<para>
In PHP versions before 5.0.0 use <function>ociexecute</function>
instead. &oci.name.compat.note;
</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
-->