(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_execute — Выполняет подготовленное выражение
Выполняет подготовленное выражение 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() их не находит.
Notice (PHP 5.2.12-pl0-gentoo):
You can parse empty query, you can execute empty query (returns true), but you cannot fetch data from empty query. So, if you provide query as variable, make sure it isn't empty.
<?php
$q = oci_parse($c, "");
if($q != false){
// parsing empty query != false
if(oci_execute($q){
// executing empty query != false
if(oci_fetch_all($q, $data, 0, -1, OCI_FETCHSTATEMENT_BY_ROW) == false){
// but fetching executed empty query results in error (ORA-24338: statement handle not executed)
$e = oci_error($q);
echo $e['message'];
}
}
else{
$e = oci_error($q);
echo $e['message'];
}
}
else{
$e = oci_error($link);
echo $e['message'];
}
?>