(PHP 5, PECL OCI8 >= 1.1.0)
oci_execute — Exécute une commande SQL Oracle
$statement
[, int $mode
= OCI_COMMIT_ON_SUCCESS
] )
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 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.