Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2007, 10h49   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
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 :
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 :
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 :
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 :
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
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 16h37   #2
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
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 :
1
2
3
4
 
$stmt = OCIParse($db_conn, "BEGIN suppressionmateriel(:$libellemat); END;");
OCIBindByName($stmt, ":$libellemat", &$libellemat, -1);
OCIExecute($stmt);
procédure stockée:

Code :
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?
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 19h33   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
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 :
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
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 20h57   #4
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
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 !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 21h03   #5
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
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 :
libellemat=p_vLibelleMat;
ça devrait aller mieux !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2007, 23h53   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bonsoir,

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

Code :
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 :
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?
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2007, 10h28   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
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....
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2007, 10h40   #8
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Citation:
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 :
1
2
 
$stmt = OCIParse($db_conn, "BEGIN SUPPRESSIONMATERIEL(':$libellemat'); END;");
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2007, 11h19   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bonjour,

merci pour votre réponse mais ça ne marche pas

en rajoutant les quotes voici le message:
Code :
1
2
 
Warning: ocibindbyname(): OCIBindByName: ORA-01036: num鲯/nom de variable interdit in c:\program files\easyphp1-8\www\intranet\traitementsuppressionmateriel.php on line 18
donc soit on arrive à trouver ce qui cloche soit je pense pouvoir passer par le "idmateriel" correspondant et là je travaillerai avec un number et non un varchar

Mais cela m'étonnerai fortement que l'on ne puisse pas inclure un varchar dans une condition dans une procedure.....

j'attends vos réponses
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2007, 15h32   #10
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bon alors pour le moment je passe par l'id car ça marche

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
$libellemat=$_POST['libellemat'];
 
$idmateriel=ociparse($db_conn,"select idmateriel from pti.materiel where libellemat='$libellemat'");
ociexecute($idmateriel);
$compteur1 = 0;
while (OCIFetch($idmateriel)) {
	$compteur1++;
	$id1=OCIResult($idmateriel, "IDMATERIEL");
 
}
OCIFreeStatement($idmateriel);
 
 
$stmt = OCIParse($db_conn, "BEGIN SUPPRESSIONMATERIEL(:$id1); END;");
OCIBindByName($stmt, ":$id1", &$id1,-1);
OCIExecute($stmt);
et la procedure

Code :
1
2
3
4
5
6
7
 
CREATE OR REPLACE procedure "SUPPRESSIONMATERIEL" (id1 IN number)
IS
begin
DELETE FROM pti.materiel WHERE idmateriel=id1;
commit; 
end;
Mais ca serait pas mal de comprendre le pourquoi du comment du probleme de gestion du varchar dans les conditions...
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2007, 14h17   #11
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bon alors ca avance

j'arrive à passer du varchar2 en parametre mais php me renvoit 2 warning:

procédure:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE procedure "CLOTUREINTERVENTION"
(p_vintervention IN NUMBER,
p_vlibellemat IN VARCHAR2)
IS
begin
UPDATE pti.archive SET solution=p_vlibellemat WHERE archive.idintervention=p_vintervention;
UPDATE pti.intervention SET datefin=sysdate WHERE intervention.idintervention=p_vintervention;
UPDATE pti.archive SET datefin=sysdate WHERE archive.idintervention=p_vintervention;
DELETE FROM pti.planning WHERE planning.idintervention=p_vintervention;
DELETE FROM pti.intervention WHERE intervention.idintervention=p_vintervention;
commit; 
 
 
end;
appel php:

Code :
1
2
3
4
5
 
$stmt = OCIParse($db_conn, "BEGIN CLOTUREINTERVENTION($intervention, '$solution'); END;");
OCIBindByName($stmt, "$intervention",&$p_vintervention,-1);
OCIBindByName($stmt, "'$solution'",&$p_vlibellemat,-1);
OCIExecute($stmt);
les deux warnings:

Code :
1
2
3
4
 
Warning: ocibindbyname(): OCIBindByName: ORA-01036: num鲯/nom de variable interdit in c:\program files\easyphp1-8\www\intranet\traitementcloture.php on line 41
 
Warning: ocibindbyname(): OCIBindByName: ORA-01036: num鲯/nom de variable interdit in c:\program files\easyphp1-8\www\intranet\traitementcloture.php on line 42
Donc si je parametre le fichier ini je peux virer les 2 warnings mais j'aimerai comprendre pourquoi il me dit ça car tout à l'air nickel
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 11h54   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
j'ai fusionné les 2 sujets qui portent sur la même problèmatique
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2007, 08h54   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
apparemment ce sont les $ qui mettent le bazard :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
// procedure_stockee.php5
// execution de fonction stockee dans la base
//
// ON veut augmenter tous les salaires d'un taux
// passe en parametre
// Pour info, le code de creation de la procedure
// dans la base est le suivant :
//
// CREATE OR REPLACE PROCEDURE augmentation
//     (taux IN NUMBER)
// AS
// BEGIN
// UPDATE emp SET sal = sal * (1 + taux /100);
// COMMIT;
// END;
// .
 
// connexion (locale)
$conn = oci_connect("scott","tiger");
 
// preparation
 
// attention !! ne pas oublier les ';'
$sql1 = "begin augmentation(:taux); end;";
$ordre = OCI_Parse ($conn, $sql1);
 
// liaison des variables Oracle et PHP
// -1 indique que c'est la longueur de $taux_saisi
// qui est utilisée pour le bind
OCI_Bind_By_Name ($ordre, ":taux", $taux_saisi , -1);
 
// execution
OCI_Execute ($ordre);
print "Nb de lignes traitées : ".OCI_Num_Rows ($ordre);
 
// liberation des ressources
OCI_Free_Statement ($ordre);
OCI_close ($conn);
?>
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 16h56   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bonjour,

votre parametre "taux" il est defini comment?

Je pensais qu'en php toutes les variables commencaient pas un "$"
Si vous pouviez m'indiquez comment vous rentrez la valeur du taux (via un input?)
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 17h03   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
aucune idée, j'y connais rien, j'ai juste chercher PHP ORACLE sous google

$ c'est pour les variables PHP, pas oracle
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2007, 20h16   #16
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bonsoir,

dsl je n'avais pas vu dans votre code le $taux_saisi autant pour moi...

Donc là je suis d'accord avec vous le passage entre php s'effectue bien!
Mais vous travaillez avec des Numbers et non des Varchars
Mon problème apparait seulement avec les VARCHAR

Je vais chercher encore mais tout les exemples sont avec des Number
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2007, 09h44   #17
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 76
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : décembre 2006
Messages : 76
Points : 12
Points : 12
bonjour,

j'ai corrigé mon problème; en effet je me suis emmelé les pinceaux entre la syntaxe des variables oracles et celles de php

je mets les codes pour que ça serve à d'autre

code procedure oracle:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE procedure "CLOTUREINTERVENTION"
(p_vintervention IN NUMBER,
p_vlibellemat IN VARCHAR2)
IS
begin
UPDATE pti.archive SET solution=p_vlibellemat WHERE archive.idintervention=p_vintervention;
UPDATE pti.intervention SET datefin=sysdate WHERE intervention.idintervention=p_vintervention;
UPDATE pti.archive SET datefin=sysdate WHERE archive.idintervention=p_vintervention;
DELETE FROM pti.planning WHERE planning.idintervention=p_vintervention;
DELETE FROM pti.intervention WHERE intervention.idintervention=p_vintervention;
commit; 
 
 
end;
code php d'appel de procedure
Code :
1
2
3
4
5
6
7
 
$solution=$_POST['solution'];
$intervention=$_POST['intervention'];
$stmt = OCIParse($db_conn, "BEGIN CLOTUREINTERVENTION(:p_vintervention, :p_vlibellemat); END;");
OCIBindByName($stmt, ":p_vintervention",$intervention,-1);
OCIBindByName($stmt, ":p_vlibellemat",$solution,-1);
OCIExecute($stmt);
voilà merci à tous j'avance, j'avance
CYCLOPE91440 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2007, 10h08   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
félicitations
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h44.


 
 
 
 
Partenaires

Hébergement Web