CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[SQL] Séquences, contraintes : Oracle

Oasis_its_good
Oasis_its_good
Niveau 7
02 avril 2007 à 15:03:59

:salut:

Alors j´explique, j´ai créé une table Catalogue, ainsi que la Forms qui lui est associée.
Elle contient la date de début et de fin de validité.

Admettons qu´il y´ait un catalogue valide du 1er janv au 31 déc 2007.
Alors je voudrais qu´on ne puisse pas créer de catalogue valable du 5 mai au 12 oct 2007.

Cette contrainte est-elle à mettre dans le script Sql des tables au moment des "create table" ou dans un trigger ?
Je n´ai jamais vraiment manipulé les séquences encore, donc j´sais pas trop par quoi commencer.

:merci: pour vos indications :)

Oasis_its_good
Oasis_its_good
Niveau 7
02 avril 2007 à 16:21:30

J´ai un peu avancé : j´ai décidé de créer une fonction verif_validite qui retourne 0 si la date est valide (c´est-à-dire que aucun catalogue n´entre en conflit avc celui qu´on veut créer).

Cette fonction renvoie une valeur > 0 si on doit pas insérer ce catalogue.

Voila la fonction :

FUNCTION Verif_validite(date_debut IN

DATE, date_fin IN DATE) RETURN NUMBER IS

resultat NUMBER;
BEGIN
resultat := 0;
go_block(´CATALOGUE´);
first_record;
IF :SYSTEM.last_record = ´FALSE´ THEN

LOOP

if (:Date_debut_validite >

date_debut AND :Date_fin_validite >

date_fin) THEN
resultat := resultat + 1;
end if;
next_record;
END LOOP;
return resultat;
end if;
END;

Le probleme, c´est que la fonction semble faire planter ma Forms.
:-(

novembre
novembre
Niveau 18
02 avril 2007 à 17:29:45

Si j´ai bien compris tu veux pas faire d´insertion si le creneau de date du catalogue entre en commune avec un déjà en base ?
Je verrais plutot un trigger de typer before insert.

Concerant les séquences, j´en vois pas l´utilité dans ton cas : les séquences sont des sortes de compteurs stockés en base qui s´incrémente à chaque appel et te permet donc d´avoir un id unique.

godrik
godrik
Niveau 30
02 avril 2007 à 17:34:53

Ce n´est pas faisable a l´aide des contraintes en SQL.
En effet les contraintes ne voient que le tuple en cours d´insertion et pas les autres tuples.

Cela est logique, les contraintes en sql représentent des contraintes de domaine de définition. Elles servent a indiquer que tel tuples n´a pas de sens.

Il faut donc décaler ta contrainte a un autre niveau: applicatif ou base de donnée. La solution des triggers semble acceptable.

novembre
novembre
Niveau 18
02 avril 2007 à 17:46:25

un truc fait à l´arrache qui peux te donner une piste :

create trigger dateCatalogue before insert on catalogue
begin
select id into dateExist
from cataglogue c
where (c.date_debut < new.date_debut and c.date_fin > new.datefin)
or ******2 autres conditions*********;

if dateExist
then
RAISE_APPLICATION_ERROR(- 20001, ´Mauvaise date´);
endif;

end;

un truc qui ressemble en gros.

Oasis_its_good
Oasis_its_good
Niveau 7
02 avril 2007 à 17:48:21

:ok: Merci d´avoir répondu , j´commencais à désespérer.

Oui novembre, je veux juste que ca mette un message qui dise qu´on insère pas la catalogue car son crénau n´est pas le bon.

J´ai laché les séquences alors. J´ai utilisé un trigger When-validate-record.

Voila à koi ca ressemble :

DECLARE
date_debut DATE;
date_fin DATE;
resultat NUMBER;
cursor c_date IS SELECT Date_debut_validite, DATE_fin_validite FROM Catalogue ORDER BY Date_debut_validite;

BEGIN
resultat := 0;
open c_date;
LOOP
FETCH c_date into date_debut, date_fin;
EXIT when c_date%NOTFOUND;
If ((date_debut >= :date_debut_validite AND date_debut <= :date_fin_validite) OR
(date_fin >= :date_debut_validite AND date_fin <= :date_fin_validite)) THEN
resultat := resultat + 1; Message(´On a trouvé eh oui !´ );
end if;
END LOOP;
CLOSE c_date;

if(resultat > 0) THEN
Message(´Catalogue existant deja Resultat = ´||resultat);
else insert into Catalogue values (N_Catalogue, Nom_Catalogue, Date_debut_validite, Date_fin_validite);
end if;
end;

Mais le probleme c´est qu´il smble y avoir une multitude de solutions, mais je n´en maitrise aucune :-(

Oasis_its_good
Oasis_its_good
Niveau 7
02 avril 2007 à 17:48:59

Ok, j´viens de lire ton post novembre, j´vais essayer de l´adapter.
Merci :)

novembre
novembre
Niveau 18
02 avril 2007 à 17:56:08

j´y pense, vois aussi pour l´update, car là rien on peux updater pour avoir des dates mauvaises.
Mais bon, regarde ca quand plutot quand ca marchera sur le insert.

Et aussi un truc essentiel dans mon exemple, je fais un raise quand l´enregistrement existe, car oracle fait un commit implicite sinon, donc faut renvoyer une erreur.

Oasis_its_good
Oasis_its_good
Niveau 7
02 avril 2007 à 17:57:46

Oki, merci bcp de ton aide en tt cas :ok:

Il faut ke je continue de voir ca en rentrant.

:merci:

Oasis_its_good
Oasis_its_good
Niveau 7
04 avril 2007 à 12:08:07

:up:

Dans ton programme Novembre, DateExist c´est bien un curseur ?

Parce que à la compil, il est dit kil faut ke je déclare DateExist.

Là en fait, j´ai créer un trigger sous forms : un when-create-record.

Voila son code :

begin
select * into dateExist
from catalogue c
where ((c.date_debut_validite <= :date_debut_validite and c.date_fin_validite >= :date_debut_validite)
or (c.date_debut_validite <= :date_fin_validite and c.date_fin_validite >= :date_fin_validite));

if dateExist
then
Message(´Ce catalogue existe deja !´ );
end if;

end;

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment