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 :

Contraintes et fonctions


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut Contraintes et fonctions
    Bonjour,
    Je suis actuellement sur une base de données pour gérer une agence de location de bateau.
    Je suis débutant avec sql et j'ai quelques soucis ...

    Mes tables sont créées jusqu'ici pas de problème (location,client,bateau,capitaine,equipage). Voici les problèmes que je rencontre:

    1. Un capitaine, un équipage et un bateau ne peuvent être associés qu'a une location à une date bien précise. Je voudrais réussir a empêcher de créer d'autre location si un capitaine ou un equipage ou un bateau sont déja loué pour cette date (une date pouvant s’étaler sur plusieurs jours). En effet un capitaine/un equipage/un bateau ne peuvent pas être a deux endroits différents en même temps
    J'ai essayé de mettre des contraintes d'unicités mais, si par exemple je les mets sur la date de départ je ne peux plus créer de location avec cette date même avec d'autres bateaux, équipages ou capitaines ...

    2. Je crée pas à pas mes fonctions et procédures, les tests indépendamment et je veux les regrouper au final dans un package. Je bloque sur une fonction SUPPRIMER. En effet je voudrais par exemple supprimer un capitaine et toutes ses informations de sa table, mais une fois supprimer je voudrais que les locations ou il est enregistré dans la table location disparaissent aussi ... Je pensais utiliser un DROP table location Constraint on cascade, mais ça à pas l'air très efficace ...

    Je pensais utilisé ça, mais ça me compile la procédure avec des erreurs de compilations et je ne vois pas vraiment ou insérer le delete on cascade :
    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
    25
    26
    27
    28
    29
    CREATE OR REPLACE Procedure deleteCapitaine(ligneCapitaine 
    	IN  CAPITAINE%ROWTYPE) IS
    	nullNotAllowed EXCEPTION;
    	PRAGMA EXCEPTION_INIT(nullNotAllowed,-20003); 
    	mess varchar2(200):=null;
    begin
     
    	DELETE from CAPITAINE where capinum=ligneCapitaine.capinum
     
    	IF ligneCapitaine.capinum IS NULL THEN
    		mess:='Le numéro du Capitaine est obligatoire';
    		RAISE nullNotAllowed;
     
    	END IF;
     
    	EXCEPTION
            WHEN nullNotAllowed THEN
            dbms_output.put_line('le numero du capitaine est obligatoire');
            dbms_output.put_line('sqlcode='|| sqlcode);
            dbms_output.put_line('sqlerrm='|| sqlerrm);
     
            WHEN OTHERS THEN
            dbms_output.put_line('ce numero de capitaine n''existe pas ');
            dbms_output.put_line('sqlcode='|| sqlcode);
            dbms_output.put_line('sqlerrm='|| sqlerrm);
     
     
    end;
    /
    Je vous remercie, bonnes fêtes.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Bonjour,
    Du point de vue business, je ne suis pas certain que effacer tous les voyages d'un capitaine qui ne travaille plus soit une bonne idée.

    Je m'explique:
    on va tres probablement vouloir garder l'historique de ses voyages, meme si il ne travaille plus.
    et de meme, on ne va pas effacer mes voyages qui étaient prévu, si? Mettons que le capitaine démissionne et que ca annule tous les voyages réservés, il risque d'y avoir des vacanciers pas content un peu plus tard!

    Une autre idée serait de pouvoir désactiver un capitaine, ça permettrait de garder l'historique. Et libre à vous de mettre le nom de capitaine à null ou a 3non assigné" pour les voyages existants.

    Au final, si vous voulez vraiment tout effacer, on vous aidera, mais je pense que ça vaut la peine d'y repenser un petit coup.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    merci pour la réponse !

    A vrai dire, c'est un projet, je cherche juste à faire fonctionner la base de données correctement, elle ne sera jamais utilisée. Il y a des choses plus ou moins cohérentes. L'idée c'est d'arriver à maîtriser les grandes lignes, ajouter, supprimer, modifier même si certaines modifications en entraînent d'autres dans la réalité. Il ne faut pas trop chercher de logique à toutes les fonctions mais dans le fond je suis d'accord avec ce que vous dites.

    J'essaye de faire les choses le plus simplement possible. Sans chercher trop loin au niveau des incohérences. Celles qui me paraissent importantes sont le fait de bloquer un equipage+un bateau+un capitaine sur une période donnée et ne pas pouvoir les enregistrer ailleurs à cette même date et si je supprime un bateau/uncapitaine de la base toutes les locations en relations seront supprimées automatiquement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Et bien alors, vous pourriez indiquer votre version de base de données, et les structures des différentes tables.

    Pour votre code qui ne compile pas, ça aiderait d'avoir les erreurs fournies par le compilateur. Ceci dit, il manque le ; à la fin du delete.

    Au point de vue logique de la procédure, quelques remarques:
    Pourquoi essayer d'effacer le capitaine, puis vérifier si le numéro de capitaine était null? Le faire avant serait plus judicieux

    Le when others, c'est à proscrire. Vous indiquez à la base que quelque soit le problème, la procédure à suivre et de faire un dbms_output, et c'est tout. Si vous ne savez pas exactement comment gérer l'erreur, il faut la laisser remonter au niveau supérieur.

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/11/2013, 16h37
  2. [XQUERY] avec contrainte ou fonction
    Par fatjoe dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 03/06/2010, 14h20
  3. [fmincon] Problème avec la fonction contrainte
    Par ENSAM-ALAMI dans le forum MATLAB
    Réponses: 0
    Dernier message: 24/04/2008, 11h32
  4. Réponses: 8
    Dernier message: 07/04/2008, 12h02
  5. Réponses: 2
    Dernier message: 23/11/2007, 11h33

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