CakeFest 2024: The Official CakePHP Conference

oci_execute

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

oci_executeEjecuta una sentencia

Descripción

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

Ejecuta la sentencia dada por statement anteriormente devuelta desde oci_parse().

Después de la ejecución, las sentencias como INSERT, por omisión, contendrán datos consolidados en la base de datos. Para sentencias como SELECT, la ejecución realiza la lógica de la consulta. Los resultados de las consultas pueden obtenerse posteriormente en PHP con funciones como oci_fetch_array().

Cada sentencia analizada podría ser ejecutada múltiples veces, ahorrando el coste de un reanálisis. Esto se utlilza comúnmente para sentencias INSERT cuando los datos están vinculados con oci_bind_by_name().

Parámetros

statement

Un identificador de sentencia de OCI válido.

mode

Este segundo parámetro opcional puede ser una de las siguietnes constantes:

Modos de ejecución
Constante Descripción
OCI_COMMIT_ON_SUCCESS Consolida automáticamente todos los cambios pendientes de esta conexión cuando la sentencia ha tenido éxito. Es la predetermianda.
OCI_DESCRIBE_ONLY Dispone los metadatos de la consulta a funciones como oci_field_name(), pero no crea un conjunto de resultados. Cualquier llamada de obtención subsiguiente, como con oci_fetch_array(), fallará.
OCI_NO_AUTO_COMMIT No consolida automáticamete los cambios. Antes de PHP 5.3.2 (PECL OCI8 1.4) use OCI_DEFAULT, la cual es equivalente a OCI_NO_AUTO_COMMIT.

Al usar el modo OCI_NO_AUTO_COMMIT se inicia o continua una transacción. Las transacciones son automáticamente revertidas cuando la conexión se cierra, o cuando el script finaliza. Para consolidar explícitamente una trasacción, invoque a oci_commit(), o a oci_rollback() para abortarla.

Cuando se insertar o actualizan datos, se recomienda usar transacciones para mantener la consistencia de datos relacionales y por razones de rendimiento.

Si se usa el modo OCI_NO_AUTO_COMMIT para cualquier sentencia, incluyendo consultas, y no se llama posteriormente a oci_commit() o oci_rollback(), OCI8 realizará una reversión al final del script incluso si no se modificó ningún dato. Para evitar reversiones innecesarias, muchos scripts no usan el modo OCI_NO_AUTO_COMMIT para consultas o PL/SQL. Tenga cuidado de asegurar la consistencia transaccional apropiada para la aplicación cuando use oci_execute() con diferentes modos en el mismo script.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 oci_execute() para consultas

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo
"<table border='1'>\n";
while (
$fila = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo
"<tr>\n";
foreach (
$fila as $elemento) {
echo
" <td>" . ($elemento !== null ? htmlentities($elemento, ENT_QUOTES) : "") . "</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

?>

Ejemplo #2 Ejemplo de oci_execute() sin especificar un modo

<?php

// Antes de ejecutarlo, cree la tabla:
// 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); // La fila se consolida y es visible inmediatamente a otros usuarios

?>

Ejemplo #3 Ejemplo de oci_execute() con OCI_NO_AUTO_COMMIT

<?php

// Antes de ejecutarlo, cree la tabla:
// 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 para PHP <= 5.3.1
}
oci_commit($conn); // consolida todos los nuevos valores: 1, 2, 3, 4, 5

?>

Ejemplo #4 Ejemplo de oci_execute() con diferentes modos de consolidación

<?php

// Antes de ejecutarlo, cree la tabla:
// 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); // datos no consolidados

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (456)');
oci_execute($stid); // consolida tanto el valor 123 como 456

?>

Ejemplo #5 Ejemplo de oci_execute() con 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";
}

?>

Notas

Nota:

Las transacciones son automáticamente revertidas cuando se cierran las conexiones, o cuando el script finaliza, lo que ocurra antes. Para consolidar explícitamente una transacción, invoque a oci_commit().

Cualquier llamada a oci_execute() que use el modo OCI_COMMIT_ON_SUCCESS, explícitamente o por omisión, consolidará cualquier transacción no consolidada anterioremente.

Cualquier sentencia DDL de Oracle, como CREATE o DROP, consolidará automáticamente cualquier transacción no consolidada.

Nota:

Debido a que la función oci_execute() generalmente envía la sentencia a la base de datos, oci_execute() puede identificar algunos errores de sintaxis que no identifica la función ligera local oci_parse().

Ver también

  • oci_parse() - Prepara una sentencia de Oracle para su ejecución

add a note

User Contributed Notes 3 notes

up
3
tower98 at gmail dot com
13 years ago
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'];
}
?>
up
-5
michaelhughes at strath dot ac dot uk
8 years ago
You can pass a "false" value to oci_execute() and this returns a null value, instead of the documented false value.
<?php
$conn
= oci_connect('username', 'password, '//hostname:1521/DB');

$result = oci_execute(false);
var_dump($result);
?>

Results in "null", so performing an Identical test:
<?php
if ($results === false) {
//throw exception
}
?>

won't trap a problem, where as the Equal test (==) would:
<?php
if ($results == false) {
//throw exception
}
?>

So testing the result of a statement like oci_parse() is important!
up
-33
filipesampaio at hotmail dot com
12 years ago
Just to write it down. I was trying to do a simple SELECT on a Caché (http://www.intersystems.com/cache/) table through an Oracle dblink, but always received the error "ORA-01002: fetch out of sequence". The solution was using OCI_NO_AUTO_COMMIT on the oci_execute function.
To Top