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

PL/SQL Oracle Discussion :

Fonction en PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut Fonction en PL/SQL
    bonsoir!voici mes tables:
    Produits (Num_Pro,Lib_Pro,Prix_U,Qtestock,Seuil_Reapro);
    Ligne_Coms (Num_Com ,Num_Pro ,Qte_Com);

    j'ai écrit une fonction qui vérifie renvoie true si la quantité commandée est inférieure à la quantité en stock sinon elle renvoie false.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE FUNCTION verifier_qtecom(qtes IN Produits.Qtestock%Type
        ,qtec IN NUMBER
        , np IN Produits.Num_Prod%TYPE
    	) Return BOOLEAN IS
      BEGIN
           SELECT Qtestock INTO qtes FROM  Produits WHERE Num_Pro=np ;
           IF qtes>qtec THEN
             Return( TRUE) ;
    		 ELSE   RETURN( FALSE) ;
    		END IF;
     
      END;
    Après l’exécution, Oracle me dit: fonction créée avec erreurs de compilation.
    Quelqu'un peut m’aider ?

  2. #2
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Bonjour,
    L'instruction SQL suivante permet d'obtenir le message d'erreur de compilation :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW ERROR FUNCTION verifier_qtecom
    Et l'erreur qui sera donnée indiquera probablement que la variable "qtes" est définie en tant que paramètre d'entrée (IN), et ne peut donc pas être modifiée avec un SELECT INTO.
    Quelle est l'objectif de ce paramètre ? Si c'est simplement pour stocker le résultat de la requête de façon temporaire, le temps de vérifier sa valeur, alors il ne faut pas utiliser un paramètre, mais une variable locale.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Utiliser une variable locale comme ceci? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE FUNCTION verifier_qtecom(qtec IN NUMBER
        , np IN Produits.Num_Pro%TYPE
    	) Return BOOLEAN IS
    	qtes Produits.Qtestock%TYPE;
      BEGIN
           SELECT Qtestock INTO qtes FROM  Produits WHERE Num_Pro=np ;
           IF qtes>qtec THEN
             Return( TRUE) ;
    		 ELSE   RETURN( FALSE) ;
    		END IF;
      END;
    est ce que le code est bon?

  4. #4
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Ca me paraît bon.
    Pour être plus propre, pour le paramètre qtec, on peut utiliser Produits.Qtestock%TYPE plutôt que NUMBER.
    Sinon, à vu de nez, ça doit compiler correctement.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 821
    Points
    30 821
    Par défaut
    Citation Envoyé par yabo84 Voir le message
    est ce que le code est bon?
    Tu ne prévois pas le cas où la ligne n'est pas trouvée dans la table, qui se pourrait se solder par une exception.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Citation:
    Tu ne prévois pas le cas où la ligne n'est pas trouvée dans la table, qui se pourrait se solder par une exception.
    En fait je fais mon premier pas dans pl/sql donc je n e connais pas grand chose dans ce langage. Comment gérer ce type d'erreur qu'on appelle EXCEPTION dans mon cas?

  7. #7
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Il y a ce tutoriel assez complet et bien fait : http://sheikyerbouti.developpez.com/pl_sql/, et concernant la gestion des erreurs ou EXCEPTIONS ici http://sheikyerbouti.developpez.com/...age=Chap1#L1.3.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut probleme de trigger
    Bonsoir!
    J'ai un problème avec mon trigger :
    voici mes tables:
    Commandes (Num_Com ,Date_Com,Nbre_lc,Mtot_Com,Num_Cli);
    Ligne_Coms (Num_Com,Num_Pro,Qte_Com)
    voici mon trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE TRIGGER ajoutCommande
    AFTER INSERT
    ON Ligne_Coms
    FOR EACH ROW
     
    BEGIN
       IF (verifier_qtecom(Qte_Com,Num_Pro)) then
        BEGIN
    		UPDATE Commandes 
    			SET nbre_lc= nbre_lc+1 where Ligne_Coms.Num_Com=Commandes.Num_Com ;
    		UPDATE Commandes
    			SET Mtot_Com = Mtot_Com + :new.Qte_Com * Prix_U WHERE Num_Com = :new.Num_Com;
     
    		UPDATE Produits
    			SET qtestock = qtestock - :new.Qte_Com  WHERE Num_Pro = :new.Num_Pro;
    		COMMIT;
    	END;
      ELSE 
       BEGIN
          DBMS_OUTPUT.PUT_LINE('Ajout annulé') ;
    	  ROLLBACK; 
    	END;
     end if;
    END;
    1- J'ai des problèmes de compilation : la fonction show err me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2/4 	PL/SQL: Statement ignored
    2/24 	PLS-00201: l'identificateur 'QTE_COM' doit être déclaré
    Je n'arrive pas à le corriger.
    2-Mon trigger est sensé incrémenter le nbre_lc, recalculer le Mot_com et soustraire le qtestock si la fonction verifier_qtecom(Qte_Com,Num_Pro)==true sinon annuler l'ajout.
    Est-ce que mon trigger répond à la question ?

Discussions similaires

  1. [SQL] fonction d'insertion sql
    Par wdionysos dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/04/2006, 16h32
  2. Quel SGBD permet d'écrire ses fonctions d'agrégation SQL?
    Par Machin0410 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 28/03/2006, 17h31
  3. Réponses: 4
    Dernier message: 18/01/2006, 10h33
  4. Fonction "Format" sous SQL
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 08/10/2004, 09h07
  5. fonction left avec sql server 6.5
    Par shake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/06/2004, 08h48

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