# oci_execute

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

oci_execute — Ejecuta 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