(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_execute — Exécute une commande SQL Oracle
$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().
statement
Un identifiant de requête OCI valide.
mode
Un second paramètre optionnel peut prendre une des constantes suivantes :
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. Avant PHP
5.3.2 (PECL OCI8 1.4), utilisez la constante
OCI_DEFAULT qui est un équivalent de la constante
OCI_NO_AUTO_COMMIT . |
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.
Cette fonction retourne true
en cas de succès ou false
si une erreur survient.
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); // utilisez OCI_DEFAULT pour PHP <= 5.3.1
}
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";
}
?>
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
ouDROP
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.