oci_execute
(PHP 5, PHP 7, PECL OCI8 >= 1.1.0)
oci_execute — Выполняет подготовленное выражение
Описание
$statement
[, int $mode
= OCI_COMMIT_ON_SUCCESS
] )
Выполняет подготовленное выражение 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() их не находит.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- Oracle OCI8
- oci_bind_array_by_name
- oci_bind_by_name
- oci_cancel
- oci_client_version
- oci_close
- oci_commit
- oci_connect
- oci_define_by_name
- oci_error
- oci_execute
- oci_fetch_all
- oci_fetch_array
- oci_fetch_assoc
- oci_fetch_object
- oci_fetch_row
- oci_fetch
- oci_field_is_null
- oci_field_name
- oci_field_precision
- oci_field_scale
- oci_field_size
- oci_field_type_raw
- oci_field_type
- oci_free_descriptor
- oci_free_statement
- oci_get_implicit_resultset
- oci_internal_debug
- oci_lob_copy
- oci_lob_is_equal
- oci_new_collection
- oci_new_connect
- oci_new_cursor
- oci_new_descriptor
- oci_num_fields
- oci_num_rows
- oci_parse
- oci_password_change
- oci_pconnect
- oci_result
- oci_rollback
- oci_server_version
- oci_set_action
- oci_set_client_identifier
- oci_set_client_info
- oci_set_edition
- oci_set_module_name
- oci_set_prefetch
- oci_statement_type
Коментарии
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'];
}
?>