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

Oracle Discussion :

Contrainte de vérification sur champ DATE


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut Contrainte de vérification sur champ DATE
    [Oracle 9i] NLS_DATE_FORMAT='DD/MM/YYYY'
    L'objectif est de contraindre les dates à une période afin d'éviter les valeurs excentriques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table MACHIN add constraint CC_DTMACHIN       
      check (DTMACHIN  between '01-JAN-1990' and '01-JAN-2100');
    La table est modifiée. J'exécute une requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DTMACHIN from MACHIN
    J'ai les enregistrements attendus avec des dates correctes.
    Maintenant je modifie le format de date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set NLS_DATE_FORMAT='DD-MON-YY'
    J'exécute la requète et là "fin de fichier de communication" et sur le fichier log "ORA-07445: exception trouvée : vidage coeur ... [Address not mapped to object] ".

    Si quelqu'un a une ébauche d'explication, je suis preneur merci d'avance.

    PS: j'ai une solution avec un trigger mais cela ne m'interresse pas.
    J'ai aussi essayé le code suivant mais cela ne change rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     alter table MACHIN add constraint CC_DTMACHIN       
      check (DTMACHIN between to_date('01/01/1990', 'dd/mm/yyyy') 
        and to_date('01/01/2100', 'dd/mm/yyyy'));

  2. #2
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table MACHIN add constraint CC_DTMACHIN       
      check (to_date(DTMACHIN,'dd/mm/yyyy')  between to_date('01/01/1990', 'dd/mm/yyyy') 
        and to_date('01/01/2100', 'dd/mm/yyyy'));

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    La réponse d'Oraman ne peut fonctionner. Pour s'en convaincre, il suffit d'exécuter la requète suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select to_char(to_date(DTMACHIN, 'dd/mm/yyyy'), 'dd/mm/yyyy') as DT1,
    to_char(DTMACHIN, 'dd/mm/yyyy') as DT2 from MACHIN
    La date DT1 est fausse, l'erreur provient de la conversion implicite de la fonction to_date.

    Toutefois cela m'a donné une idée qui fonctionne mais je ne suis pas convaincu que cela soit la meilleure. Je préférerai ne pas avoir à convertir le champ date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table MACHIN add constraint CC_DTMACHIN     
      check (to_char(DTMACHIN, 'yyyymmdd') between '19900101' and '21000101');

  4. #4
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Par défaut
    oui t'as raison j'ai oublié un to_char avant le to_date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table MACHIN add constraint CC_DTMACHIN       
      check (to_date(to_char(DTMACHIN,'dd/mm/yyyy')),'dd/mm/yyyy')  between to_date('01/01/1990', 'dd/mm/yyyy') 
        and to_date('01/01/2100', 'dd/mm/yyyy'));
    là tu compare des dates

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    si DTEMACHIN est une date, je ne vois pas pourquoi la constraint CHECK ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE MACHIN ADD CONSTRAINT MACHIN_DTE
      CHECK (DTE BETWEEN TO_DATE('01.01.2004', 'dd.mm.yyyy') 
        			AND TO_DATE('01-01/2100', 'dd-mm/yyyy')
    		);
    J'ai essayé, aucun problème.

    INSERT INTO MACHIN
    VALUES(TO_DATE('01-JAN-2000', 'DD-MON-YYYY'))
    ORA-02290: check constraint (MCM.MACHIN_DTE) violated

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Pour répondre à McM, DTMACHIN est une date. Le problème survient lorsque je modifie la variable NLS_DATE_FORMAT. Cette modification me permet de tester des configurations différentes.

    Pour suivre la réponse de Oraman, la solution fonctionne. Mais 4 appels de fonction dans la contrainte, je trouve que c'est un peu lourd.

Discussions similaires

  1. Trier un listview sur champ date
    Par codial dans le forum IHM
    Réponses: 6
    Dernier message: 08/12/2009, 17h03
  2. Requete sur champ Date
    Par kmaniche dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/10/2006, 10h38
  3. Requete sur champ DATE MySQL
    Par tom06440 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/09/2006, 17h45
  4. Erreur sur champ date
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 11/09/2006, 17h56
  5. Requête sur champ DATE
    Par bud_gw dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/12/2005, 13h18

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