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 :

Ajout d'une contrainte d'intégrité (CHECK ((Concerner.QteCom+Stocker.QteStock)<=Stocker.QteMax) [10g]


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Ajout d'une contrainte d'intégrité (CHECK ((Concerner.QteCom+Stocker.QteStock)<=Stocker.QteMax)
    Bonjour,

    Je sollicite votre aide car depuis quelques jours je bloque sur un problème "scolaire".

    En effet, étant en Master, je dois rendre quelques requêtes. Je n'ai pas réellement eu de problèmes jusque là mais je bloque sur une demande :
    "Les quantités commandées sont compatibles avec les quantités en stock et les quantités max", donc lorsqu'une commande est ajouté la qte commandé d'un produit + la quantité en stock d'un produit doit être inférieur ou égale à la quantité max stockable du produit.

    Je cherche à créer une contrainte du type : (CHECK ((Concerner.QteCom+Stocker.QteStock)<=Stocker.QteMax).

    J'ai essayé de créer une fonction (que je ne maitrise absolument pas), et bien sûr ça ne marche pas :
    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
    CREATE FUNCTION fct_Lim_QteComCon
      (@QteCom Number(4))
      RETURNS Number
      AS
    BEGIN
     
      IF (
          SELECT Con.QteCom+S.QteSock
          FROM Concerner Con, Stocker S, Produit P
          WHERE Con.ProdNum=P.ProdNum
          AND P.ProdNum=S.ProdNum
          AND C.ComNum=Con.ComNum)>(
                                    SELECT S.QteMax
                                    FROM Concerner Con, Stocker S, Produit P
                                    WHERE Con.ProdNum=P.ProdNum
                                    AND P.ProdNum=S.ProdNum
                                    AND C.ComNum=Con.ComNum)
        Return 'False'
      Return 'True'
    END;
     
    ALTER TABLE Concerner Add Constraint Lim_QteCom CHECK (fct_Lim_QteComCon(QteCom)='true');
    Si une âme charitable peux m'expliquer comment résoudre ce problème, j'en serais très heureux.

    Merci par avance à ceux qui pourront m'aider.
    Cordialement.
    RiRioudess

    PS : Merci à Winjerome pour l'ajout des balise Code !!!

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Plusieurs erreurs de syntaxe dans la fonction, je doute qu'elle compile correctement. Par exemple, tu ne peux pas mettre une requête SELECT directement dans un test IF.
    De toute façon, tu ne peux pas appeler une fonction utilisateur dans une contrainte CHECK.
    Tu as indiqué être en 10g et être en Master. Donc ton école vous fait utiliser une base de données dont la version est obsolète depuis une décennie ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    En effet, il nous a été demandé de travailler sur la version 10g.
    La date de remise de cette requête ait passé mais je suis curieux de savoir s'il y a une réponse possible au problème posé dans le sujet ?

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il faut créer un trigger BEFORE INSERT (or update) FOR EACH ROW qui va faire la vérif et faire un RAISE si la quantité n'est pas correcte.

    Exemple
    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
    CREATE OR REPLACE TRIGGER Con_BIU
    BEFORE INSERT OR UPDATE OF QteCom
    ON CONCERNER
    FOR EACH ROW
    DECLARE
    	v NUMBER;
    BEGIN
    	SELECT 1
    	INTO v
    	FROM Stocker 
    	WHERE ProdNum = :new.Prodnum
    	AND :new.QteCom + S.QteSock > S.QteMax
     
    	RAISE_APPLICATION_ERROR(-20001, 'Article '|| :new.prodNum ||' : Qte Cde '|| :new.qteCom ||' + Stock > Stock Max'); 
     
    EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, je vais essayer de ce pas

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

Discussions similaires

  1. Problème de timeout suite à l'ajout d'une contrainte check
    Par Kropernic dans le forum Développement
    Réponses: 5
    Dernier message: 13/01/2016, 10h30
  2. Réponses: 5
    Dernier message: 16/07/2011, 16h49
  3. Enlever une contrainte d'intégrité
    Par sliderman dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 18/03/2008, 11h41
  4. Réponses: 4
    Dernier message: 15/02/2008, 15h24
  5. Modifier une contrainte d'intégrité sur un champ
    Par muadhib dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2007, 16h54

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