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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 1
    Points
    1
    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 habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    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
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 1
    Points
    1
    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 habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    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 é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
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 1
    Points
    1
    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.

  7. #7
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par Toshtuk
    Mais 4 appels de fonction dans la contrainte, je trouve que c'est un peu lourd.
    ça a ebngendré des lenteurs ? bizarre

  8. #8
    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
    Citation Envoyé par Toshtuk
    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.
    J'avais vu mais je ne comprend pas, une date est stockée en base dans un format interne, avec les heures, minutes, quelque soit le NLS_DATE_FORMAT.

    J'ai testé en modifiant mon NLS_DATE_FORMAT au niveau session et j'ai eu aucun problème.

    Pour info, Quelle version et système utilises tu ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    peut-être un problème de conversion lié à l'utilisation de l'année YY et pas RR...

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select to_date(sysdate,'DD.MM.RRRR') from dual
     
    14.09.2006
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select to_date(sysdate,'DD.MM.YYYY') from dual
     
    14.09.0006
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    A Yorglaa, C'est la même erreur qu'Oraman. Si tu remplaces sysdate par une date fixe (par exemple '17/09/2006'), tu n'auras plus l'erreur.

    Pour McM,
    serveur [redhat Oracle9i] NLS_DATE_FORMAT='DD-MON-RRRR'
    client [windowsXP Oracle9i] NLS_DATE_FORMAT='DD/MM/YYYY'
    Je ne pense pas que cela soit important mais j'ai une séquence sur la date DTMACHIN.

    Pour Oraman, j'ai conscience que ce qui suit est étrange et c'est cela aussi que j'essaye de comprendre. La contrainte influence les requêtes .

    Sinon je pense que je vais opter pour cette solution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table MACHIN add constraint CC_DTMACHIN
      check (extract(year from DTMACHIN) between 1990 and 2100);

  11. #11
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    je ne comprends pas une chose, qu'est-ce que tu entends par "j'ai une séquence sur DTMACHIN ?"

    je ne suis pas au courant qu'on puisse utiliser une séquence sur une date...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    "j'ai une séquence sur DTMACHIN ?"
    Je me suis trompé. Je voulais dire un index.

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par Toshtuk
    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] ".
    C'est surement un bug oracle ça, ou un problème d'install, c'est balot, parceque à mon avis la seule bonne solution est de faire une comparaison de ta date avec des to_date, parceque faire dépendre une contraite d'une variable de session client, faut aimer le risque...

    Citation Envoyé par Oraman
    to_date(to_char(DTMACHIN,'dd/mm/yyyy')),'dd/mm/yyyy')
    ça sert à quoi de convertir une date en caractères pour la reconvertir en date ???

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