oci_execute
(PHP 5, PECL OCI8 >= 1.1.0)
oci_execute — 执行一条语句
说明
bool oci_execute
( resource $stmt
[, int $mode
] )
   oci_execute() 执行一条之前被解析过的语句(见
   oci_parse())。可选参数 mode
   允许定义执行模式(默认是
   OCI_COMMIT_ON_SUCCESS)。如果不需要将语句自动提交,则需要把
   mode 设为 OCI_DEFAULT。
  
   用 OCI_DEFAULT
   模式时,将建立一个事务。事务会在关闭连接或脚本结束时(看哪个先)自动回卷。需要明确调用
   oci_commit() 来提交事务,或者
   oci_rollback() 中止事务。
  
   成功时返回 TRUE, 或者在失败时返回 FALSE。
  
Note:
在 PHP 5.0.0 之前的版本必须使用 ociexecute() 替代本函数。该函数名仍然可用,为向下兼容作为 oci_execute() 的别名。不过其已被废弃,不推荐使用。
参数
statement
      
A valid OCI statement identifier.
mode
      
        An optional second parameter can be one of the following constants:
        Execution Modes
           Constant
           Description
           OCI_COMMIT_ON_SUCCESS
           Automatically commit all outstanding changes for
             this connection when the statement has succeeded. This
             is the default.
           OCI_DEFAULT
           Obsolete as of PHP 5.3.2 (PECL OCI8 1.4) but still
             available for backward compatibility.  Use the
             equivalent OCI_NO_AUTO_COMMIT in new
             code.
           OCI_DESCRIBE_ONLY
           Make query meta data available to functions
             like oci_field_name() but do not
             create a result set. Any subsequent fetch call such
             as oci_fetch_array() will
             fail.
           OCI_NO_AUTO_COMMIT
           Do not automatically commit changes.  Prior to PHP
             5.3.2 (PECL OCI8 1.4)
             use OCI_DEFAULT which is an alias
             for OCI_NO_AUTO_COMMIT.
      
       Using OCI_NO_AUTO_COMMIT mode starts a
       transaction. Transactions are automatically rolled back when
       the connection is closed, or when the script ends.  Explicitly
       call oci_commit() to commit a transaction,
       or oci_rollback() to abort it.
      
When inserting or updating data, using transactions is recommended for relational data consistency and for performance reasons.
       If OCI_NO_AUTO_COMMIT mode is used for any
       statement including queries, and
        oci_commit()
       or oci_rollback() 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 OCI_NO_AUTO_COMMIT mode for queries or
       PL/SQL.  Be careful to ensure the appropriate transactional
       consistency for the application when
       using oci_execute() with different modes in
       the same script.
      
返回值
   成功时返回 TRUE, 或者在失败时返回 FALSE。
  
范例
Example #1 oci_execute() for queries
<?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) : " ") . "</td>n";
}
echo "</tr>n";
}
echo "</table>n";
?>
Example #2 oci_execute() without specifying a mode example
<?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
?>
Example #3 oci_execute() with OCI_NO_AUTO_COMMIT example
<?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
?>
Example #4 oci_execute() with different commit modes example
<?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
?>
Example #5 oci_execute() with
     OCI_DESCRIBE_ONLY example
<?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";
}
?>
注释
Note:
Transactions are automatically rolled back when connections are closed, or when the script ends, whichever is soonest. Explicitly call oci_commit() to commit a transaction.
    Any call to oci_execute() that uses
    OCI_COMMIT_ON_SUCCESS mode explicitly or by
    default will commit any previous uncommitted transaction.
   
Any Oracle DDL statement such as CREATE or DROP will automatically commit any uncommitted transaction.
Note:
Because the oci_execute() function generally sends the statement to the database, oci_execute() can identify some statement syntax errors that the lightweight, local oci_parse() function does not.
Note:
In PHP versions before 5.0.0 use ociexecute() instead. 在当前版本中,旧的函数名还可以被使用,但已经被废弃并不建议使用。
参见
oci_parse() - 配置 Oracle 语句预备执行