aci_execute

aci_execute — 执行一条语句

说明

aci_execute(resource $stmt, int $mode = ?): bool

aci_execute() 执行一条之前被解析过的语句(见 aci_parse())。可选参数 mode 允许定义执行模式(默认是 aci_COMMIT_ON_SUCCESS)。 如果不需要将语句自动提交,则需要把 mode 设为 aci_DEFAULT。

用 aci_DEFAULT 模式时,将建立一个事务。事务会在关闭连接或脚本结束时(看哪个先)自动回卷。 需要明确调用 aci_commit() 来提交事务,或者 aci_rollback() 中止事务。

成功时返回 true, 或者在失败时返回 false

注意:
在 PHP 5.0.0 之前的版本必须使用 aciexecute() 替代本函数。该函数名仍然可用,为向下兼容作为 aci_execute() 的别名。不过其已被废弃,不推荐使用。

参数

statement 有效的OCI语句标识符。

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

执行模式

名称 描述
aci_COMMIT_ON_SUCCESS 语句成功后,自动提交此连接的所有未完成更改。这是默认设置。
aci_DEFAULT 自PHP 5.3.2(PECL ACI8 1.4)起已过时,但仍可用于向后兼容。在新代码中使用等效的aci_NO_AUTO_COMMIT。
aci_DESCRIBE_ONLY 使查询元数据可用于aci_field_name()等函数,但不要创建结果集。任何后续的提取调用(如aci_fetch_array())都将失败。
aci_NO_AUTO_COMMIT 不要自动提交更改。在PHP 5.3.2(PECL ACI8 1.4)之前,使用aci_DEFAULT,它是aci_NO_AUTO_COMMIT的别名。

使用aci_NO_AUTO_COMMIT模式启动事务。当连接关闭或脚本结束时,事务会自动回滚。显式调用 aci_commit() 提交事务,或调用 aci_rollback() 中止事务。

插入或更新数据时,出于关系数据一致性和性能原因,建议使用事务。

如果aci_NO_AUTO_COMMIT模式用于包括查询在内的任何语句,并且随后没有调用 aci_commit()aci_rollback(),那么即使没有更改任何数据,OCI8也会在脚本末尾执行回滚。 为了避免不必要的回滚,许多脚本不使用aci_NO_AUTO_COMMIT模式进行查询或PL/SQL。在同一脚本中使用不同模式的aci_execute()时,请注意确保应用程序的适当事务一致性。

返回值

成功时返回 true, 或者在失败时返回 false

范例

示例 #1 aci_execute() for queries

<?php

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

$stid = aci_parse($conn, 'SELECT * FROM employees');
aci_execute($stid);

echo "<table border='1'>\n";
while ($row = aci_fetch_array($stid, aci_ASSOC+aci_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 aci_execute() without specifying a mode example

<?php

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

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

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

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

?>

示例 #3 aci_execute() with aci_NO_AUTO_COMMIT example

<?php

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

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

$stid = aci_parse($conn, 'INSERT INTO mytab (col1) VALUES (:bv)');
aci_bind_by_name($stid, ':bv', $i, 10);
for ($i = 1; $i <= 5; ++$i) {
    aci_execute($stid, aci_NO_AUTO_COMMIT);  // use aci_DEFAULT for PHP <= 5.3.1
}
aci_commit($conn);  // commits all new values: 1, 2, 3, 4, 5

?>

示例 #4 aci_execute() with different commit modes example

<?php

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

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

$stid = aci_parse($conn, 'INSERT INTO mytab (col1) VALUES (123)');
aci_execute($stid, aci_NO_AUTO_COMMIT);  // data not committed

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

?> 示例 #5 aci_execute() with aci_DESCRIBE_ONLY example

<?php

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

$stid = aci_parse($conn, 'SELECT * FROM locations');
aci_execute($s, aci_DESCRIBE_ONLY);
for ($i = 1; $i <= aci_num_fields($stid); ++$i) {
    echo aci_field_name($stid, $i) . "<br>\n";
}

?>

注释

注意:
当连接关闭或脚本结束时(以最快者为准),事务会自动回滚。显式调用aci_commit()以提交事务。
显式或默认情况下使用aci_COMMIT_ON_SUCCESS模式的对aci_execute()的任何调用都将提交任何以前未提交的事务。
任何DDL语句(如CREATE或DROP)都将自动提交任何未提交的事务。
注意:
因为aci_execute()函数通常会将语句发送到数据库,所以 :doc:`aci_execute() <aci_execute>`可以识别轻量级本地:doc:`aci_parse() <aci_parse>`函数不会识别的一些语句语法错误。
注意:
在5.0.0之前的PHP版本中,请改用aciexecute()。

参见

aci_parse()- 配置数据库语句预备执行