Partage
  • Partager sur Facebook
  • Partager sur Twitter

Creation d'un trigger Oracle

    13 janvier 2018 à 22:16:34

    Bonjour,
    Je dois réaliser un exercice sur la réservation de chambre dans des hotels. 
    ma base comporte 4 tables qui sont les suivantes :
    ROOM (IdRoom, RoomLibelle, RoomType, RoomPrice, #IdCenter)
    CLIENT (IdClient, CliName, CliAdrese, CliZip, CliTown, CliTel)
    BOOKING (IdO, #IdClient,, #Idcenter, NoInitialWeekBook, NbrSRoom, NbrDRoom, NbrWeek, #idRoom)
    CENTER (IdCenter, CenterLibelle, CenterTown)

    Lors d'une insertion dans la table BOOKING, je souhaiterai vérifier que l'INSERT ne soit pas en train d'essayer d'insérer une réservation pour une chambre déjà réservé à la même date.
    Pour vérifier cela, je dois vérifier que l'idclient n'est pas déjà présent dans la base pour la date de réservation demandée, en additionnant le champ NoInitialWeekBook (qui est le numéro de la semaine de l'année de début de réservation) et le champ NbrWeek (qui est le nombre de semaine reservées).
    J'ai essayé de crée un trigger :
    CREATE OR REPLACE TRIGGER Client_reservation BEFORE INSERT ON booking FOR EACH ROW
    DECLARE 
    	add_sem integer;
    	add_room integer;
    BEGIN
    	SELECT NoInitialWeekBook + nbrweek, idroom INTO add_sem, add_room FROM booking 
    	WHERE idroom =:NEW.idroom;
    	IF add_sem > :new.NoInitialWeekBook THEN
    	DBMS_OUTPUT.PUT_LINE('Désolé, chambre déjà prise');
    	END IF;
    END;
    /
    Mais cela ne fonctionne pas. Premièrement ça me met le code d'erreur suivant : ORA-01403: aucune donnée trouvée
    Ce qui est logique vu que dans ma table booking je n'ai pas de ligne encore, mais je ne sais pas comment gérer ça avec une exception, pour insérer s'il n'y a pas de ligne.
    Serait il possible d'avoir des indications pour effectuer cela de la bonne manière. 
    Merci d'avance.

    -
    Edité par julienmop 13 janvier 2018 à 22:22:28

    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2018 à 19:49:56

      En Oracle PL/SQL (et le trigger est du PL/SQL) tu utilises exception pour traiter les exceptions, et dans ton cas il faut l'intercepter car l'occurence de l'exception indique que l'insertion doit avoir lieu

      CREATE OR REPLACE TRIGGER Client_reservation BEFORE INSERT ON booking FOR EACH ROW
      DECLARE
          add_sem integer;
          add_room integer;
      BEGIN
          SELECT NoInitialWeekBook + nbrweek, idroom INTO add_sem, add_room FROM booking
          WHERE idroom =:NEW.idroom;
      	-- l'exception va annuler l'insertion
      	RAISE_APPLICATION_ERROR(-20101, 'Désolé, chambre déjà prise.');
      	EXCEPTION 
      		WHEN NO_DATA_FOUND THEN
      			DBMS_OUTPUT.PUT_LINE('Ok, chambre est réservée');
      END;
      /

      http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm

      Autre solution (voir si cela fait du sens dans ton cas) remplacer la requête de vérification par une requête avec un count() qui alors ne retournera jamais d'exception

      • Partager sur Facebook
      • Partager sur Twitter

      Creation d'un trigger Oracle

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown