IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Appel procedure stockée oracle avec php


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut Probleme procedure stockée DELETE oracle avec php
    Bonjour,

    je vous explique mon problème:

    à l'heure actuelle je me sers de php pour inserer des données dans ma base de donnée or je souhaiterai simplement faire appel à une procédure stocké qui sera appelée avec php

    bref mes variables que j'ai avec php sont:

    $libellemat (varchar2), $id1 (number), $id2 (number), $id3 (number)

    Code d'insertion php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $request="insert into pti.materiel (idmateriel,libellemat,idsalarie,idtypemateriel,idsystemeos) values('','$libellemat',$id1,$id2,$id3)";
    $insert=ociparse($db_conn,$request);
    ociexecute($insert);
    Donc j'ai remplacé ce code par l'appel de la procédure qui contient des erreurs à priori au niveau des ocibindbynames:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $stmt = OCIParse($db_conn, "BEGIN ajoutmateriel(:$libellemat, :$id1, :$id2, :$id3); END;");
    OCIBindByName($stmt, ":$libellemat", &$libellemat, -1);
    OCIBindByName($stmt, ":$id1", &$id1, -1);
    OCIBindByName($stmt, ":$id2", &$id2, -1);
    OCIBindByName($stmt, ":$id3", &$id3, -1);
    OCIExecute($stmt);
    et voici le code de la procédure stockée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create or replace procedure "AJOUTMATERIEL" (libellemat IN VARCHAR2, id1 IN NUMBER,
    id2 IN NUMBER,
    id3 IN NUMBER)
    is
    begin
    insert into pti.materiel (idmateriel,libellemat,idsalarie,idtypemateriel,idsystemeos) values('','libellemat',id1,id2,id3);
     
    end;
    C'est la première fois que je crée une procédure stockée et je crois que je m'emmèle les pinceaux

    ci joint les erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of ocibindbyname(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php on line 52
     
    Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of ocibindbyname(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php on line 53
     
    Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of ocibindbyname(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php on line 54
     
    Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of ocibindbyname(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php on line 55
     
    Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php:52) in c:\program files\easyphp1-8\www\intranet\traitementajoutmateriel1.php on line 2

    Pouvez vous m'aider à créer correctement ma procédure et à corriger mon code php

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    bon j'ai trouvé l'erreur:

    il y a 2 fois le parametre "allow_call_time_pass_reference" dans le fichier ini à mettre à "on";

    Donc tout marche bien pour des procedures d'insertion

    Par contre pour une procedure de suppression ça ne marche pas:

    code php d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $stmt = OCIParse($db_conn, "BEGIN suppressionmateriel(:$libellemat); END;");
    OCIBindByName($stmt, ":$libellemat", &$libellemat, -1);
    OCIExecute($stmt);
    procédure stockée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create or replace procedure "SUPPRESSIONMATERIEL" (libellemat IN VARCHAR2)
    is
    begin
    delete from pti.materiel where libellemat=libellemat; 
    end;
    Le problème c'est qu'avec une procedure comme ça et bien j'efface toute ma table materiel....
    Je n'arrive pas à mettre la bonne syntaxe pour la condition (='$libellemat' en sql direct)

    avez vous une idée?

  3. #3
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    bien sûr !
    regarde ta clause where :
    si ta variable a le même nom que la colonne à comparer, Oracle val alors comparer la colonne AVEC la COLONNE ou la variable avec la variable...

    donc le reésultat de la comparaison est toujours TRUE et du coup efface chaque ligne !

    change le nom de ton paramètre libellemat en p_vLibelleMat (dans la déclaration de la procédure) et fait ton WHERE comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libellemat=p_vLibelleMat;
    ça devrait aller mieux !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut Probleme procedure stockée DELETE
    bonjour,

    j'essaye de faire une procédure de suppression mais il ne prend pas en compte le parametre envoyé par php dans la condition where

    procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create or replace procedure "SUPPRESSIONMATERIEL" (materiel IN VARCHAR2)
    is
    begin
    delete from pti.materiel where libellemat=materiel;
    commit; 
    end;
    Donc si je mets libellemat='materiel' il va essayer de supprimer le matériel "materiel" et non le matériel sélectionné à partir de ma liste déroulante de ma page php...

    J'ai essayé '&materiel' mais ça ne marche pas

    Comment régler mon problème? avec "materiel" en number ca serait facile car pas besoin de quote mais en varchar je ne vois pas comment faire

    merci de votre aide

  5. #5
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    ta procédure est parfaitement juste, au niveau Oracle.
    à mon avis ton soucis vient du côté de php... tu dois juste lui renvoyer la bonne valeur !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    bonsoir,

    je ne pense pas que ce soit du coté php car si je passe la requete directement avec php ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $user=ucfirst($_SESSION['user']);
    $password=$_SESSION['password'];
    $db_conn = ocilogon( "pti", "rugbys" ,"//127.0.0.1/XE");
    $libellemat=$_POST['libellemat'];
     
    $request="delete from pti.materiel where libellemat='$libellemat' ";
    $delete=ociparse($db_conn,$request);
    ociexecute($delete);
    voici ce que j'ai avec la procedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $user=ucfirst($_SESSION['user']);
    $password=$_SESSION['password'];
    $db_conn = ocilogon( "pti", "rugbys" ,"//127.0.0.1/XE");
    $libellemat=$_POST['libellemat'];
     
    $stmt = OCIParse($db_conn, "BEGIN SUPPRESSIONMATERIEL(:$libellemat); END;");
    OCIBindByName($stmt, ":$libellemat", &$materiel,-1);
    OCIExecute($stmt);
    donc là je ne pige vraiment pas ce qui cloche
    je pensais que ca venait des quotes

    qu'en pense tu?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    bon alors pour moi c'est un probleme de quote car quand j'execute la procedure en mode console et que je rentre simplement "a" comme valeur ça ne marche pas par contre quand je mets " 'a' " là ca marche....

  8. #8
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    bon alors pour moi c'est un probleme de quote car quand j'execute la procedure en mode console et que je rentre simplement "a" comme valeur ça ne marche pas par contre quand je mets " 'a' " là ca marche....
    Si c'est le cas, alors essaye de rajouter les quotes dans ton appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $stmt = OCIParse($db_conn, "BEGIN SUPPRESSIONMATERIEL(':$libellemat'); END;");
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR XI] Comment utiliser une procedure stockée oracle avec crystal report XI
    Par saidms dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2011, 09h28
  2. [Oracle] PHP ne retourne que la dernière ligne d'un resultat d'une procedure stockée ORACLE
    Par tytous dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 08/06/2010, 07h57
  3. Appeler procedure stockée avec un parametre
    Par clouddd dans le forum ASP.NET
    Réponses: 11
    Dernier message: 12/10/2009, 11h26
  4. [WD9] Appel d'une procedure stockée Oracle
    Par flora_vig dans le forum WinDev
    Réponses: 21
    Dernier message: 16/10/2008, 17h43
  5. [VB/Oracle]Pb d'appel procedure stocké
    Par Misha dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/07/2008, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo