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

PL/SQL Oracle Discussion :

To_char(SYSDATE, 'DAY') like 'MARDI'


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Par défaut To_char(SYSDATE, 'DAY') like 'MARDI'
    Bonjour, j'ai un code pour mon trigger (sous Oracle) dans lequel je souhaite interdire les transactions sur la table MENU, le jour de Mardi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create or replace trigger ST_B_DIU_MENU
    before delete or insert or update on MENU
     
    begin
     
    if to_char(SYSDATE, 'DAY') like 'MARDI' then
     
     raise_application_error(-20690, 'Impossible à cette heure: ' || to_char(SYSDATE, 'DAY HH:MM:SS'));
     
    end if;
     
    end ST_B_DIU_MENU;
    Après plusieurs tests, la condition n'est jamais vérifiée, alors que lorsque je teste la date :

    > select to_char(SYSDATE, 'DAY') from dual
    MARDI
    Je ne vois vraiment pas.

    Merci beaucoup.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Si tu regardes la chaine exacte retournée (chez moi du moins) c'est 'MARDI ' avec 3 espaces à la fin.
    Le LIKE employé tout seul fait la même chose qu'un = j'ai l'impression. Il faut que tu écrives LIKE 'MARDI%', le % est le symbole pour dire "n'importe quel(s) caractère(s)"

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Cela dit à ta place je testerais plutôt le numéro du jour dans la semaine :

    "D : N° du jour dans la semaine (par exemple Lundi =1, Mardi =2, etc...) Attention la notation peut changer en fonction de vos paramètres NLS."

    Fais juste attention si ta semaine commence lundi ou dimanche...

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ou alors, utiliser le format fmDAY qui supprime les espaces superflus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    To_Char(sysdate, 'fmDAY')

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 247
    Par défaut Re: To_char(SYSDATE, 'DAY') like 'MARDI'
    Fais également attention d'avoir le même NLS_LANG sur ton poste et sur ton serveur de BDD !

    En FRENCH, le select te renvoie MARDI
    En AMERICAN, le select te revoie TUESDAY

    Or, si ton poste est en FRENCH, et que ta BDD est en AMERICAN, alors quand ton trigger se déclenche, il te renvoie TUESDAY et non pas MARDI, et donc, ta condition ne sera jamais vérifiée !

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par TeamArkadia Voir le message
    Or, si ton poste est en FRENCH, et que ta BDD est en AMERICAN, alors quand ton trigger se déclenche, il te renvoie TUESDAY et non pas MARDI, et donc, ta condition ne sera jamais vérifiée !
    C'est faux. Si le client définit NLS_LANG alors les paramètres NLS définis côté serveur -dans le fichier d'initialisation- NE sont PAS pris en compte):

    The language and territory components of the NLS_LANG parameter determine the default values for other detailed NLS parameters, such as date format, numeric characters, and linguistic sorting.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 247
    Par défaut
    Bonjour pifor,

    Je suis désolé si j'ai écrit une erreur, mais c'est ce qu m'est arrivé il y a quelque temps quand une de mes procédures Oracle...

    Dans ma procédure j'avais le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF ( TRIM(TO_CHAR(SYSDATE, 'DAY')) = 'LUNDI' ) THEN
       ...
    ELSE
       ...
    END IF;
    Tous les tests effectués sur cette procédure ayant été concluant, on m'a demandé de la passer en production, et de la schéduler tous les soirs, ce que j'ai donc fait.

    Or le lundi suivant, je me suis aperçu que la procédure n'avait pas effectué le traitement voulu...

    Du coup, je me suis mis à revérifier ma procédure de A à Z, d'abord sur mon poste, puis directement sur le serveur, et tout fonctionné normalement...

    Et c'est en faisant un copier / coller de mon curseur que je me suis aperçu de ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TRIM(TO_CHAR(SYSDATE, 'DAY')) FROM DUAL
     
    Sur mon poste = LUNDI
    Sur le serveur = MONDAY
    J'ai donc modifié ma procédure comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF ( TRIM(TO_CHAR(SYSDATE, 'DAY')) IN ('LUNDI', 'MONDAY') ) THEN
       ...
    ELSE
       ...
    END IF;
    et ça a résolu mon problème.

    Par la suite, j'ai modifié le NLS de mon poste pour le mettre en AMERICAN, au moins depuis, je ne suis plus embêté par ce genre de problèmes !

    Donc peut être que ça n'a rien à voir, mais dans tous les cas, c'est ce qui m'a permis de résoudre mon problème...

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    On est d'accord:

    Dire que la "BDD est en AMERICAN" est ambigü puisque dès que NLS_LANG est défini, les paramètres d'initialisation NLS_xxx ne sont plus pris en compte.

    Le fait de changer la valeur de NLS_LANG côté client influe bien sur le format de date utilisé par une session. Notez que ceci est bien le cas que le client soit connecté en local ou par Oracle Net.

    Pour éviter ce genre de problème, il est recommandé de définir en dur les paramètres NLS, soit avec ALTER SESSION, un trigger on logon voir directement dans le code SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> select to_char(sysdate,'day') from dual;
     
    TO_CHAR(
    --------
    mercredi
     
    SQL> select to_char(sysdate,'day','NLS_DATE_LANGUAGE=AMERICAN') from dual;
     
    TO_CHAR(S
    ---------
    wednesday
     
    SQL>

Discussions similaires

  1. Alias dynamique avec sysdate - n days dedans
    Par lbar012001 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/03/2014, 16h39
  2. Comparaison avec to_char(x.date,'Day')
    Par uNreal dans le forum SQL
    Réponses: 8
    Dernier message: 06/06/2012, 12h11
  3. Pb config Client avec TRUNC(SYSDATE,'DAY')
    Par GAEREL dans le forum SQL
    Réponses: 3
    Dernier message: 07/09/2010, 10h09
  4. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 14h23
  5. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 18h10

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