PHP Unconference Europe 2015

oci_execute

(PHP 5, PECL OCI8 >= 1.1.0)

oci_executeExécute une commande SQL Oracle

Description

bool oci_execute ( resource $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().

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. 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.

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($stidOCI_ASSOC+OCI_RETURN_NULLS)) {
    echo 
"<tr>\n";
    foreach (
$row as $item) {
        echo 
"    <td>" . ($item !== null htmlentities($itemENT_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'$i10);
for (
$i 1$i <= 5; ++$i) {
    
oci_execute($stidOCI_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($stidOCI_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($sOCI_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

add a note add a note

User Contributed Notes 2 notes

up
0
filipesampaio at hotmail dot com
3 years ago
Just to write it down. I was trying to do a simple SELECT on a Caché (http://www.intersystems.com/cache/) table through an Oracle dblink, but always received the error "ORA-01002: fetch out of sequence". The solution was using OCI_NO_AUTO_COMMIT on the oci_execute function.
up
0
tower98 at gmail dot com
4 years ago
Notice (PHP 5.2.12-pl0-gentoo):
You can parse empty query, you can execute empty query (returns true), but you cannot fetch data from empty query. So, if you provide query as variable, make sure it isn't empty.

<?php
$q
= oci_parse($c, "");
if(
$q != false){
   
// parsing empty query != false
   
if(oci_execute($q){
       
// executing empty query != false
       
if(oci_fetch_all($q, $data, 0, -1, OCI_FETCHSTATEMENT_BY_ROW) == false){
           
// but fetching executed empty query results in error (ORA-24338: statement handle not executed)
           
$e = oci_error($q);
            echo
$e['message'];
        }
    }
    else{
       
$e = oci_error($q);
        echo
$e['message'];
    }
}
else{
   
$e = oci_error($link);
    echo
$e['message'];
}
?>
To Top