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

SQL Oracle Discussion :

Erreur de syntaxe trigger


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut Erreur de syntaxe trigger
    Bonjour,

    J'ai écris un petit trigger+ procédure afin d'avoir un historique de modification de champs ... Voici ce que cela donne, seulement j'ai un problème de l'insertion de ma date j'aimerais qu'elle soit plus précise date+heure ce qui me permettrait de faire un order by Madate plus précis!

    Voici ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE OR REPLACE PROCEDURE ufd_bkhiccl_on_bkcccl_insert (  p_age IN CHAR
    			    , p_cli IN CHAR
    			    , p_anva IN CHAR
    			    , p_nova IN CHAR
    			    , p_lib IN CHAR
    			    , p_uti IN CHAR
    			    , p_dmo IN DATE
    			    , p_hmo IN CHAR
                 , p_code IN CHAR)
    AS
    BEGIN
    	IF ( p_code = '105' OR p_code = '4' OR p_code = '101' OR p_code = '104' OR p_code = '106' OR p_code = '107' OR p_code = '108' )
    	THEN
    		INSERT INTO ufd_bkhiccl
    		VALUES ( p_age
    		       , p_cli
    		       , p_anva
    		       , p_nova
    		       , p_lib
    		       , p_uti
    		       , p_dmo
    		       , p_hmo
                 , p_code);
    	END IF;
     
    END ufd_bkhiccl_on_bkcccl_insert;
     
    CREATE OR REPLACE TRIGGER ufd_bkhiccl
    AFTER INSERT ON BKCCL
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
     
        ufd_bkhiccl_on_bkcccl_insert(:new.age, :new.cli, :new.anva, :new.nova,
        				      :new.lib, :new.uti, :new.dmo, :new.hmo, :new.nozone);
     
    END;
    /
    Donc comme vous pouvez le voir aujourd'hui j'ai une zone dmo (date de modif) et hmo (heure de modif). Sauf que comme un naze ma zone hmo est un CHAR ... Donc cette zone va disparaitre ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    CREATE OR REPLACE PROCEDURE ufd_bkhiccl_on_bkcccl_insert (  p_age IN CHAR
    			    , p_cli IN CHAR
    			    , p_anva IN CHAR
    			    , p_nova IN CHAR
    			    , p_lib IN CHAR
    			    , p_uti IN CHAR
    			    , p_dmo IN DATE
    			    , p_hmo IN CHAR
                 , p_code IN CHAR)
    AS
    BEGIN
    	IF ( p_code = '105' OR p_code = '4' OR p_code = '101' OR p_code = '104' OR p_code = '106' OR p_code = '107' OR p_code = '108' )
    	THEN
    		INSERT INTO ufd_bkhiccl
    		VALUES ( p_age
    		       , p_cli
    		       , p_anva
    		       , p_nova
    		       , p_lib
    		       , p_uti
    		       , TO_DATE(p_dmo||p_hmo,'DD-MM-YYYY HH24:MI:SS')
                 , p_code);
    	END IF;
    
    END ufd_bkhiccl_on_bkcccl_insert;
    
    CREATE OR REPLACE TRIGGER ufd_bkhiccl
    AFTER INSERT ON BKCCL
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
    
        ufd_bkhiccl_on_bkcccl_insert(:new.age, :new.cli, :new.anva, :new.nova,
        				      :new.lib, :new.uti, :new.dmo, :new.hmo, :new.nozone);
    
    END;
    /
    Sauf que j'ai une erreur que je n'arrive pas à déceler sur le code en gras, oracle me dit parenthèse de droite absente ...

    Auriez vous une idée svp?

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je ne vois rien qui justifierait l’erreur que vous avez mentionnée. Mais j’ai plusieurs remarqués :

    1. Insert Into table Values sans préciser les noms des colonnes est un bug qui attends joyeusement à se manifester.
    2. Dans
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TO_DATE(p_dmo||p_hmo,'DD-MM-YYYY HH24:MI:SS')
      Suivez toujours attentivement les types des données ! To_date est une fonction de conversion qui prends en entré un paramètre de type chaîne des caractères. P_dmo est un paramètre de votre procédure déclarée comme date donc != chaîne des caractères. Pour que p_dmo soit concaténé avec p_hmo il doit être convertie dans le type chaine des caractères ! Cette coercition se fait avec les paramètres nls_date_format en vigueur.
    3. Attention aux différences entre les types des données CHAR et VARCHAR2.
    4. De plus normalement une variable de type date chez Oracle contient toujours la partie temps. Donc votre gestion est un peu bizarre : pourquoi avoir extrait la partie temps de la date pour la réintégrer après ?

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut
    Merci pour toutes ces suggestions.

    Comme vous l'avez dit la gestion est un peu bizarre...
    Etant donné que la personne qui avait mis en place cette gestion n'est plus là, je ne peux pas trop vous répondre...
    Ce qui est sûr c'est que j'ai besoin de cette date.
    Et je ne vois pas d'autre solution que de faire comme ça.

    De plus je ne peux pas changer le nls_date_format!!

    N'y aurait t'il pas une autre solution svp?

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut
    Je sais que j'ai des erreurs dans ce code mais je cherche en même temps.
    Même si ce n'est pas une solution très jolie, serais je sur la bonne voix en faisant quelque chose comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE OR REPLACE TRIGGER ufd_bkhiccl
    AFTER INSERT OR UPDATE ON BKCCL
    FOR EACH ROW
     
    DECLARE
       f_date       CHAR(8) ;
     
    BEGIN
       f_date := CAST(:new.dmo AS CHAR(8));
       :new.dmo := TO_DATE(f_date||:new.hmo, 'DD-MM-YYYY HH24:MI:SS');
     
        ufd_bkhiccl_on_bkcccl_insert(:new.age, :new.cli, :new.anva, :new.nova,
        				      :new.lib, :new.uti, :new.dmo, :new.hmo, :new.nozone);
     
    END;
    /
    SHOW errors;
     
    exit;

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Si dmo est de type date et si hmo est une chaine des caractères formatés 'HH24:MI:SS' alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    To_Date(To_Char(:new.dmo,'DD/MM/YYYY')||':new.hmo','DD/MM/YYYY HH24:MI:SS')
    Si non il faut adapter le format.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut
    Merci beaucoup pour votre aide !!!!

    Petite correction du code proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    To_Date(To_Char(:new.dmo,'DD/MM/YYYY')||:new.hmo,'DD/MM/YYYY HH24:MI:SS')
    Encore merci.!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de syntaxe sur trigger avec mysql 5.1
    Par WhoIsTiti dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 29/03/2012, 07h18
  2. Erreur de syntaxe d'un trigger
    Par Tidus159 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/04/2011, 08h27
  3. Erreur de syntaxe TRIGGER
    Par Blocks dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/02/2011, 05h24
  4. Erreur de syntaxe sur un trigger
    Par mmahouac dans le forum Développement
    Réponses: 1
    Dernier message: 07/04/2009, 17h15
  5. Erreur de syntaxe dans un trigger
    Par bastiii dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/09/2008, 08h47

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