Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 16/01/2008, 12h31   #1
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
Par défaut PL-SQL : Création et Exécution Procédure

Salut à tous et à toutes,

J'ai créé une procédure en PL-SQL qui prend 3 paramètres en entrée et fait à partir de ces 3 paramètres 1 select dans une table puis 1 insert dans une autre.
Lorsque j'ai créé ma procédure il m'a demandé de saisir mes 3 paramètres afin de compiler et de créer ma procédure. Jusque là tout va bien.

Si j'essaye d'executer ma procédure avec d'autres paramètres en entrée :
SQL > exec recalcul ('xxx', '01/01/2007', '31/12/2007');
il les ignore et conserve ceux passés lors de la création de ma procédure.

Comment puis-je faire pour que les paramètres saisis soient pris en compte ?

Merci pour vos réponses.
Mimile28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 14h48   #2
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
Voici la code de ma procédure :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE OR REPLACE PROCEDURE SUPPR_X ( REF_CONTRAT VARCHAR2, DATE_DEB DATE, DATE_FIN DATE) IS
CURSOR curseur IS SELECT contratfac_numfac, entpiedfac_type 
	   		   	  FROM contratfac, entpiedfac 
				  WHERE contratfac_refcontrat = '&REF_CONTRAT'
				  AND contratfac_numfac = entpiedfac_numfac
				  AND entpiedfac_datefact BETWEEN to_date('&DATE_DEB', 'dd/mm/yyyy') AND to_date('&DATE_FIN', 'dd/mm/yyyy');
BEGIN
	 FOR Cur IN Curseur Loop
       	 INSERT INTO USER_OWNER_GC.CMDFACT ( CMDFACT_IDF, CMDFACT_ACTION, CMDFACT_IDFPARAM,  CMDFACT_UTILIS, CMDFACT_DATE, CMDFACT_MOTIF,CMDFACT_ETAT, CMDFACT_COMMENT, CMDFACT_TYPEFACT, CMDFACT_NUMFACANNU, CMDFACT_CMDFACTPREC)
		 VALUES (ALSIGETIDFCMDFACTSUIV,41,cur.contratfac_numfac ,'ADMINISTRATEUR', sysdate, NULL ,'A', NULL , cur.entpiedfac_type, NULL , NULL );
		 COMMIT;
     End loop ;
END;
Quand je la compile et que la crée, je dois saisir les 3 paramètres => OK 0 erreurs
Si ensuite je l'exécute :
exec ('xxx', '01/08/2007', '31/12/2007') ces nouveaux paramètres ne sont pas pris en compte. Ceux saisis lors de la compilation sont conservés.
Mimile28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 15h05   #3
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
C'est plus facile pour nous en voyant ton code

Il faut supprimer les cotes (') et les & dans l'utilisation des paramètres en entrée (je pense qu'il y a confusion avec un autre SGBD => SQL Server ?), puis recompiler.
Les & ont pour effet de te demander d'entrer en dur une valeur aux paramètres, et comme ça se passe lors de la compilation, ces valeurs sont conservées comme si tu les avais écrites en lieu et place des paramètres justement.
Il serait de bon ton aussi de rajouter un 'IN' pour signifier que ce sont des paramètres en entrée.

Essaie de recompiler la procédure suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE OR REPLACE PROCEDURE SUPPR_X ( REF_CONTRAT IN VARCHAR2, DATE_DEB IN DATE, DATE_FIN IN DATE) IS
CURSOR curseur IS SELECT contratfac_numfac, entpiedfac_type 
	   		   	  FROM contratfac, entpiedfac 
				  WHERE contratfac_refcontrat = REF_CONTRAT
				  AND contratfac_numfac = entpiedfac_numfac
				  AND entpiedfac_datefact BETWEEN to_date(DATE_DEB, 'dd/mm/yyyy') AND to_date(DATE_FIN, 'dd/mm/yyyy');
BEGIN
	 FOR Cur IN Curseur Loop
       	 INSERT INTO USER_OWNER_GC.CMDFACT ( CMDFACT_IDF, CMDFACT_ACTION, CMDFACT_IDFPARAM,  CMDFACT_UTILIS, CMDFACT_DATE, CMDFACT_MOTIF,CMDFACT_ETAT, CMDFACT_COMMENT, CMDFACT_TYPEFACT, CMDFACT_NUMFACANNU, CMDFACT_CMDFACTPREC)
		 VALUES (ALSIGETIDFCMDFACTSUIV,41,cur.contratfac_numfac ,'ADMINISTRATEUR', sysdate, NULL ,'A', NULL , cur.entpiedfac_type, NULL , NULL );
		 COMMIT;
     End loop ;
END;
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 15h13   #4
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
Merci beaucoup !!!
La procédure compile et se crée correctement.

J'ai essayé de l'exécuter avec :

Code :
1
2
 
exec suppr_x ('D/BA12345', '01/01/2007','31/12/2007')
Rien ne se passe, le INSERT ne se fait pas.
Les paramètres saisis sont corrects pourtant. Si je reprends le SELECT du curseur avec ces paramètres j'ai des enregistrements qui sortent.

Y a-t-il un moyen d'intercepter la commande INSERT avec la valeur des différents paramètres ?

Merci encore
Mimile28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 15h20   #5
Membre régulier
 
Inscription : avril 2003
Messages : 131
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 131
Points : 72
Points : 72
Code :
1
2
3
4
5
FOR Cur IN Curseur Loop
       	 INSERT INTO USER_OWNER_GC.CMDFACT ( CMDFACT_IDF, CMDFACT_ACTION, CMDFACT_IDFPARAM,  CMDFACT_UTILIS, CMDFACT_DATE, CMDFACT_MOTIF,CMDFACT_ETAT, CMDFACT_COMMENT, CMDFACT_TYPEFACT, CMDFACT_NUMFACANNU, CMDFACT_CMDFACTPREC)
		 VALUES (ALSIGETIDFCMDFACTSUIV,41,cur.contratfac_numfac ,'ADMINISTRATEUR', sysdate, NULL ,'A', NULL , cur.entpiedfac_type, NULL , NULL );
		 COMMIT;
     End loop ;
Code :
1
2
3
4
5
FOR Cur IN Curseur Loop
       	 INSERT INTO USER_OWNER_GC.CMDFACT ( CMDFACT_IDF, CMDFACT_ACTION, CMDFACT_IDFPARAM,  CMDFACT_UTILIS, CMDFACT_DATE, CMDFACT_MOTIF,CMDFACT_ETAT, CMDFACT_COMMENT, CMDFACT_TYPEFACT, CMDFACT_NUMFACANNU, CMDFACT_CMDFACTPREC)
		 VALUES (ALSIGETIDFCMDFACTSUIV,41,Cur.contratfac_numfac ,'ADMINISTRATEUR', sysdate, NULL ,'A', NULL , Cur.entpiedfac_type, NULL , NULL );
		 COMMIT;
     End loop ;
Hum, peut être les variables sont case sensitive ? J'ai jamais testé sans tenir compte de la casse.
DjinnS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 15h33   #6
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Je pense que la première donnée du VALUES (ALSIGETIDFCMDFACTSUIV) ne peut pas être interprétée : je suppose qu'il s'agit d'une chaîne de caractères, donc à mettre entre côtes, sinon il l'interprète comme une variable (alors que ça n'a pas l'air d'en être une).

Idem pour la deuxième valeur (41) si jamais elle est inséré vers un champs qui n'est pas en NUMBER.
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 15h57   #7
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
Alors j'ai essayé avec le "C" majuscule ça ne change rien

Pour ce qui est de "ALSIGETIDFCMDFACTSUIV" c'est une fonction qui retourne l'identifiant (primary key) qui doit être utilisé pour insérer une nouvelle ligne dans la table (sequence).
J'ai également essayé de mettre à la place nom_de_la_sequence.nexval mais cela ne change rien le INSERT ne se fait pas.

Le 41 est inséré dans une colonne de type "NUMBER".

Bizarrement quand je saisissais mes paramètres lors de la création de la procédure l'INSERT s'effectuait bien...

Merci encore pour votre aide
Mimile28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 16h08   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
  • Commit à l’intérieur d’un boucle c’est MAUVAIS !
  • Le paramètres de la procédure (DATE_DEB et DATE_FIN)sont déclarées comme étant de type DATE . Par contre l’appel est fait en passant des Varchar . Et les Varchars ne sont pas de Dates et Oracle fait dans ce cas une conversion implicite (c’est une malheur vu le nombre de bug que cella provoque cette confusion entre les DATES et les VARCHAR). Et c’est ça le problème.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 16h17   #9
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
J'ai supprimé le commit de la boucle.

Ensuite pour l'appel de ma procédure j'ai fait :
Code :
1
2
 
exec suppr_x('D/BA000001', to_date('01/01/2007', 'dd/mm/yyyy'), to_date('31/12/2007','dd/mm/yyyy'))
Aucun changement... le INSERT ne se fait pas.

Y a aucun moyen de voir le INSERT qui est réellement exécuté avec les valeurs des différentes variables ?
Mimile28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 16h20   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Si l'insert ne se fait pas c'est parce que le curseur ne ramène rien!
Et c'est quoi to_date(DATE_DEB, 'dd/mm/yyyy'). DATE_DEB c'est une DATE déjà !
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 16h26   #11
Invité régulier
 
Inscription : mai 2003
Messages : 31
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 31
Points : 5
Points : 5
Effectivement le to_date sur des dates il aime pas...
C'était juste ça ...

Merci encore à tous pour votre aide
A charge de revanche si je peux vous aider !!
Mimile28 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 12h19.


 
 
 
 
Partenaires

Hébergement Web