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

SQL Oracle Discussion :

PL-SQL : Création et Exécution Procédure


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    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.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Voici la code de ma procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup !!!
    La procédure compile et se crée correctement.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 131
    Points : 97
    Points
    97
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    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 !

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    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

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    • 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.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    J'ai supprimé le commit de la boucle.

    Ensuite pour l'appel de ma procédure j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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à !

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    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 !!

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

Discussions similaires

  1. [WD16] Connexion SQL SERVEUR pour exécuter une procédure stockée
    Par philippe30 dans le forum WinDev
    Réponses: 10
    Dernier message: 17/10/2023, 20h54
  2. Création d'une procédure PL/SQL de chargement
    Par sidahme67 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 18/04/2013, 09h46
  3. Réponses: 6
    Dernier message: 03/08/2012, 10h39
  4. Réponses: 3
    Dernier message: 05/08/2009, 17h03
  5. [SQL SERVER 2K]Droits d'exécution procédure stockée
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 16/05/2006, 15h01

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