oci_execute

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

oci_execute执行语句

描述

oci_execute(resource $statement, int $mode = OCI_COMMIT_ON_SUCCESS): bool

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

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

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

参数

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_execute() 使用 OCI_NO_AUTO_COMMIT 示例

<?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_execute() 使用 OCI_DESCRIBE_ONLY 示例

<?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() 函数无法识别的一些语句语法错误。

另请参阅

添加说明

用户贡献说明 3 条说明

tower98 at gmail dot com
13 年前
注意 (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: 语句句柄未执行)
$e = oci_error($q);
echo
$e['message'];
}
}
else{
$e = oci_error($q);
echo
$e['message'];
}
}
else{
$e = oci_error($link);
echo
$e['message'];
}
?>
michaelhughes at strath dot ac dot uk
8 年前
您可以将 "false" 值传递给 oci_execute(),它将返回一个 null 值,而不是文档中记录的 false 值。
<?php
$conn
= oci_connect('username', 'password, '//hostname:1521/DB');

$result = oci_execute(false);
var_dump($result);
?>

结果为 "null",因此执行身份测试
<?php
if ($results === false) {
// 抛出异常
}
?>

不会捕获问题,而相等测试 (==) 会
<?php
if ($results == false) {
// 抛出异常
}
?>

因此,测试 oci_parse() 等语句的结果很重要!
filipesampaio at hotmail dot com
13 年前
写下来。 我试图通过 Oracle dblink 对 Caché (http://www.intersystems.com/cache/) 表执行简单的 SELECT,但总是收到错误 "ORA-01002: fetch out of sequence"。 解决方法是在 oci_execute 函数中使用 OCI_NO_AUTO_COMMIT。
To Top