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) : " ") . "</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()- 配置数据库语句预备执行