oci_execute
(PHP 5, PHP 7, PECL OCI8 >= 1.1.0)
oci_execute — Выполняет подготовленное выражение
Описание
$statement
, int $mode
= OCI_COMMIT_ON_SUCCESS
) : bool
Выполняет подготовленное выражение statement
, созданное с помощью
функции oci_parse().
Сразу после выполнения выражения подобного INSERT
,
по умолчанию все данные сразу будут сохранены в базе данных. Для
выражений подобных SELECT
, выполняется только
логика запроса. Результат же запроса можно получить позже в PHP
с помощью функций подобных oci_fetch_array().
Каждое подготовленное выражение может быть выполнено несколько раз
для экономии на издержках от повторной подготовки запроса.
Это чаще всего применяется для выражений 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
Не сохранять автоматически изменения. Для PHP 5.3.2 (PECL OCI8 1.4) используйте OCI_DEFAULT
, которая является эквивалентом дляOCI_NO_AUTO_COMMIT
.Использование режима
OCI_NO_AUTO_COMMIT
открывает или продолжает транзакцию. Эта транзакция автоматически откатывается при закрытии соединения или завершении скрипта. Используйте oci_commit() для завершения транзакции и oci_rollback() для ее отмены.При вставке и обновлении данных рекомендуется использование транзакций для реляционной целостности данных и для улучшения производительности.
Если для какого-нибудь выражения используется режим
OCI_NO_AUTO_COMMIT
, и впоследствии не используются oci_commit() или oci_rollback(), то OCI8 будет выполнять откат при завершении скрипта даже если данные не были изменены. Для избежания ненужных откатов большинство скриптов не используют режимOCI_NO_AUTO_COMMIT
для запросов или PL/SQL. Будьте внимательны, чтобы обеспечить надлежащую согласованность транзакций при использовании 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) : "") . "</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); // use OCI_DEFAULT for PHP <= 5.3.1
}
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); // data not committed
$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (456)');
oci_execute($stid); // commits both 123 and 456 values
?>
Пример #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_execute(), который принудительно использует
OCI_COMMIT_ON_SUCCESS
или по умолчанию будет завершать любую предыдущую незакрытую транзакцию.Любое выражение Oracle DDL подобное
CREATE
илиDROP
будет автоматически завершать любую. незакрытую транзакцию.
Замечание:
Так как функция oci_execute() обычно отправляет выражения в базу данных, то oci_execute() может найти некоторые незначительные синтаксические ошибки, когда локальная oci_parse() их не находит.