PHP Conference Japan 2024

oci_execute

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_execute执行语句

描述

oci_execute(资源 $statement, 整数 $mode = OCI_COMMIT_ON_SUCCESS): 布尔值

执行先前从 oci_parse() 返回的 statement

执行后,诸如 INSERT 之类的语句默认情况下会将数据提交到数据库。对于诸如 SELECT 之类的语句,执行将执行查询的逻辑。查询结果随后可以使用诸如 oci_fetch_array() 之类的函数在 PHP 中提取。

每个已解析的语句可以执行多次,从而节省了重新解析的成本。当使用 oci_bind_by_name() 绑定数据时,这通常用于 INSERT 语句。

参数

statement

有效的 OCI 语句标识符。

mode

可选的第二个参数可以是以下常量之一

执行模式
常量 描述
OCI_COMMIT_ON_SUCCESS 当语句成功时,自动提交此连接的所有未完成更改。这是默认值。
OCI_DESCRIBE_ONLY 使查询元数据可用于诸如 oci_field_name() 之类的函数,但不会创建结果集。任何随后的提取调用(例如 oci_fetch_array())都将失败。
OCI_NO_AUTO_COMMIT 不要自动提交更改。

使用 OCI_NO_AUTO_COMMIT 模式开始或继续事务。当连接关闭或脚本结束时,事务会自动回滚。显式调用 oci_commit() 以提交事务,或 oci_rollback() 以中止它。

插入或更新数据时,建议使用事务来确保关系数据的一致性和提高性能。

如果对任何语句(包括查询)使用 OCI_NO_AUTO_COMMIT 模式,并且随后没有调用 oci_commit()oci_rollback(),则即使没有更改数据,OCI8 也会在脚本结束时执行回滚。为了避免不必要的回滚,许多脚本不会对查询或 PL/SQL 使用 OCI_NO_AUTO_COMMIT 模式。在同一脚本中使用不同模式的 oci_execute() 时,请务必确保应用程序具有适当的事务一致性。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 用于查询的 oci_execute()

<?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";

?>

示例 #2 不指定模式的 oci_execute() 示例

<?php

// 运行前,创建表格:
// 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); // 行已提交,其他用户可以立即看到

?>

示例 #3 使用 OCI_NO_AUTO_COMMIToci_execute() 示例

<?php

// 运行前,创建表格:
// 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); // 提交所有新值:1、2、3、4、5

?>

示例 #4 使用不同提交模式的 oci_execute() 示例

<?php

// 运行前,请创建表:
// 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); // 数据未提交

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (456)');
oci_execute($stid); // 提交 123 和 456 两个值

?>

示例 #5 使用 OCI_DESCRIBE_ONLYoci_execute() 示例

<?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";
}

?>

注释

注意:

当连接关闭或脚本结束时,事务将自动回滚,以先发生者为准。请显式调用 oci_commit() 来提交事务。

任何使用 OCI_COMMIT_ON_SUCCESS 模式(显式或默认)调用的 oci_execute() 函数都会提交任何先前未提交的事务。

任何 Oracle DDL 语句(如 CREATEDROP)都会自动提交任何未提交的事务。

注意:

因为 oci_execute() 函数通常会将语句发送到数据库,所以 oci_execute() 可以识别轻量级本地 oci_parse() 函数无法识别的某些语句语法错误。

参见

添加注释

用户贡献注释 1 条注释

3
tower98 at gmail dot com
14 年前
注意 (PHP 5.2.12-pl0-gentoo)
您可以解析空查询,可以执行空查询(返回 true),但无法从空查询中获取数据。因此,如果将查询作为变量提供,请确保它不为空。

<?php
$q
= oci_parse($c, "");
if(
$q != false){
// 解析空查询 != false
if(oci_execute($q){
// 执行空查询 != false
if(oci_fetch_all($q, $data, 0, -1, OCI_FETCHSTATEMENT_BY_ROW) == false){
// 但获取已执行的空查询结果会导致错误 (ORA-24338: statement handle not executed)
$e = oci_error($q);
echo
$e['message'];
}
}
else{
$e = oci_error($q);
echo
$e['message'];
}
}
else{
$e = oci_error($link);
echo
$e['message'];
}
?>
To Top