PHP Conference Japan 2024

oci_execute

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

oci_execute執行敘述

說明

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

執行先前從 oci_parse() 返回的 敘述

執行後,像 INSERT 這樣的敘述預設會將資料提交到資料庫。對於像 SELECT 這樣的敘述,執行會執行查詢的邏輯。查詢結果可以使用 PHP 中的函式(例如 oci_fetch_array())來擷取。

每個已解析的敘述可以執行多次,節省重新解析的成本。這通常用於使用 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($stid, 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 則註解

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: 陳述式控制代碼未執行)
$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