oci_execute
(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_execute — Exécute une commande SQL Oracle
Description
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ée 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étadonnées de la requête disponibles 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é. Pour éviter ce comportement,
la plupart des scripts n'utilisent pas le mode
OCI_NO_AUTO_COMMIT pour les requêtes ou
les procédures stockées PL/SQL. Il faut s'assurer de la consistance
transactionnelle appropriée des 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); // données non validées
$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 pu
ne pas détecter.