(PHP 5, PHP 7, PHP 8, 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 |
Не сохранять автоматически изменения. |
Использование режима 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);
}
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() их не находит.