# oci_execute

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

oci_execute — Exécute une commande SQL Oracle

### Description

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

Exécute une requête `statement` précédemment retournée par la fonction oci_parse().

Après exécution, les requêtes comme `INSERT` auront par défaut les données validées (commitées) sur la base de données. Pour les requêtes comme `SELECT`, l'exécution effectue la logique de la requête. Les résultats de la requête peuvent être récupérés par PHP avec des fonctions comme oci_fetch_array().

Chaque requête analysé peut être exécutée plusieurs fois, inutile donc de les analyser de nouveau. Ceci est pratique pour des requêtes de type `INSERT` lorsque des données y sont liées grâce à la fonction oci_bind_by_name().

### Liste de paramètres

`statement`

  Un identifiant de requête OCI valide.

`mode`

  Un second paramètre optionnel peut prendre une des constantes suivantes :

  Modes d'exécution
  Constante | Description
  --- | ---
  `OCI_COMMIT_ON_SUCCESS` | Validation automatique sur la connexion lorsque la requête a été exécutée avec succès. C'est le comportement par défaut.
  `OCI_DESCRIBE_ONLY` | Rend les méta-donnes de la requête disponible aux fonctions comme oci_field_name() mais ne crée pas de jeu de résultats. Tout appel à des fonctions de récupération comme oci_fetch_array() échouera.
  `OCI_NO_AUTO_COMMIT` | Ne valide pas automatiquement les modifications.

  L'utilisation du mode `OCI_NO_AUTO_COMMIT` démarre ou continue une transaction. Les transactions sont automatiquement annulées lorsque la connexion est fermée ou lorsque le script se termine. Appelez explicitement la fonction oci_commit() pour valider la transaction ou la fonction oci_rollback() pour l'annuler.

  Lors de l'insertion ou de la mise à jour de données, l'utilisation de transactions est fortement recommandée pour garantir la consistance relationnelle des données, mais aussi en raison d'un gain non négligeable de performance.

  Si le mode `OCI_NO_AUTO_COMMIT` est utilisé pour toutes opérations y compris les requêtes, et que les fonctions oci_commit() et oci_rollback() ne sont jamais appelées, OCI8 effectuera une annulation à la fin du script même si les données ont changées. Pour éviter ce comportement, la plupart des scripts n'utilise pas le mode `OCI_NO_AUTO_COMMIT` pour les requêtes ou les procédures stockées PL/SQL. Assurez-vous de la consistance transactionnelle appropriée de vos applications lors de l'utilisation de la fonction oci_execute() avec différents modes dans le même script.

### Valeurs de retour

Cette fonction retourne `true` en cas de succès ou `false` si une erreur survient.

### Exemples

Exemple #1 Exemple avec oci_execute() pour des requêtes

`<?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";
?>`

Exemple #2 Exemple avec oci_execute() sans spécifier de mode

`<?php
// Avant exécution, créez la table :
// 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 ligne est validée et est immédiatement visible par les autres utilisateurs
?>`

Exemple #3 Exemple avec oci_execute() et `OCI_NO_AUTO_COMMIT`

`<?php
// Avant exécution, créez la table :
// 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); // valide toutes les nouvelles valeurs : 1, 2, 3, 4, 5
?>`

Exemple #4 Exemple avec oci_execute() et différents modes dans le même script

`<?php
// Avant exécution, créez la table :
// 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); // valide à la fois les valeurs 123 et 456
?>`

Exemple #5 Exemple avec oci_execute() et `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";
}
?>`

### Notes

> Note:

> Les transactions sont automatiquement annulées lorsque les connexions sont fermées, ou lorsque le script se termine, suivant ce qui arrive en premier. Appelez explicitement la fonction oci_commit() pour valider une transaction.

> Tout appel à la fonction oci_execute() qui utilise le mode `OCI_COMMIT_ON_SUCCESS` explicitement ou par défaut validera toutes les transactions en cours.

> Toutes les requêtes Oracle DDL comme `CREATE` ou `DROP` valideront toutes les transactions en cours.

> Note:

> À cause du fait que la fonction oci_execute() envoie généralement la requête à la base de données, la fonction oci_execute() peut identifier les erreurs de syntaxe de la requête que la fonction oci_parse() aurait pû ne pas détecter.

### Voir aussi

- oci_parse() - Prépare une requête SQL avec Oracle