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 Procédural MySQL Discussion :

[MySQL] Problème de fonctions et de triggers


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 83
    Par défaut [MySQL] Problème de fonctions et de triggers
    Bonjour et meilleurs vœux en cette nouvelle année

    J'ai récupéré un dump d'une base mysql (5.0.70) et à côté de ça, un fichier avec une liste de trigger et de fonctions.

    La base est bien importée mais impossible d'ajouter les triggers et fonctions.
    Ne connaissant pas trop ces deux animaux là, et l'erreur renvoyée par mysql ne m'aidant absolument pas (#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4), je m'en remets à vous.

    Dans chaque cas, la table et les champs concernés existent bien.
    Quelqu'un pourrait-il me dire ce qui cloche svp ?

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    CREATE TRIGGER contacts_cstm_onInsert BEFORE INSERT ON contacts_cstm
    FOR EACH ROW 
    BEGIN
    IF (NEW.password_c ="") OR (NEW.password_c IS NULL) THEN 
      SET NEW.password_c = SUBSTRING(UUID(), 1, 6);
    END IF;
    END;
     
    CREATE TRIGGER contacts_cstm_onUpdate BEFORE UPDATE ON contacts_cstm
    FOR EACH ROW 
    BEGIN
    IF (NEW.password_c ="") OR (NEW.password_c IS NULL) THEN 
      SET NEW.password_c = SUBSTRING(UUID(), 1, 6);
    END IF;
    END;
     
    CREATE TRIGGER factures_onUpdate BEFORE UPDATE ON factures
    FOR EACH ROW
    BEGIN
      SET NEW.locked=(IF(NEW.statut>1,1,0));
    END;
     
    CREATE TRIGGER opportunities_onUpdate BEFORE UPDATE ON opportunities
    FOR EACH ROW
    BEGIN
      SET NEW.name=REPLACE(NEW.name," ","");
    END;
     
    CREATE TRIGGER opportunities_onInsert BEFORE INSERT ON opportunities
    FOR EACH ROW
    BEGIN
      SET NEW.name=REPLACE(NEW.name," ","");
    END;
     
    CREATE FUNCTION FACTURE_SUMALLMONTANT (contactid CHAR(36)) 
    RETURNS DOUBLE
    DETERMINISTIC
    BEGIN
    DECLARE x DOUBLE;
    SELECT SUM(IF(fl1.type_ligne=0,fl1.prix_unitaire*fl1.quantite*(1+fl1.tva),0)) INTO x
    FROM factures fac 
    LEFT JOIN facture_ligne fl1 ON fl1.facture_id=fac.id AND fl1.deleted=0 AND fac.statut not in (1,9)
    WHERE fac.deleted=0 AND fac.destinataire=contactid;
    IF x IS NULL THEN  SELECT 0 INTO x;
    END IF ;
    RETURN x;
    END;
     
    CREATE FUNCTION REGLEMENT_SUMALLMONTANT (contactid CHAR(36)) 
    RETURNS DOUBLE
    DETERMINISTIC
    BEGIN
    DECLARE x DOUBLE;
    SELECT SUM(montant) INTO x
    FROM reglements reg,contacts_reglements conreg
    WHERE reg.id=conreg.reglement_id 
     AND reg.deleted=0 
     AND conreg.deleted=0
     AND reg.statut  IN ("BANK_DEPOSIT","CHECK_OK","DRAFT")
     AND conreg.contact_id=contactid;
     
    IF x IS NULL THEN  SELECT 0 INTO x;
    END IF ;
    RETURN x;
    END;
     
    CREATE FUNCTION BALANCE (contactid CHAR(36)) 
    RETURNS DOUBLE
    DETERMINISTIC
    BEGIN
    DECLARE x DOUBLE;
    SELECT FACTURE_SUMALLMONTANT(contactid)-REGLEMENT_SUMALLMONTANT(contactid) INTO x;
    IF x IS NULL THEN  SELECT 0 INTO x;
    END IF ;
    RETURN x;
    END;
     
    CREATE FUNCTION BALANCE_CONTENTIEUX (contactid CHAR(36)) 
    RETURNS DOUBLE
    DETERMINISTIC
    BEGIN
    DECLARE x DOUBLE;
    SELECT BALANCE(contactid)-SUM(IF(type_ligne=0,prix_unitaire*quantite*(1+tva),0)) INTO x
    FROM factures fac, facture_ligne fl 
    WHERE fl.facture_id=fac.id 
    AND fac.destinataire=contactid
    AND fl.deleted=0 AND fac.deleted=0
    AND MONTH(fac.date_facture)=MONTH(CURDATE())
    AND YEAR(fac.date_facture)=YEAR(CURDATE());
    IF x IS NULL THEN  SELECT 0 INTO x;
    END IF ;
    RETURN x;
    END;
    Merci.

  2. #2
    Membre très actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Par défaut New ou Inserted
    Verifier est ce que MySql supporte 'New' et 'Old',
    par exemple SQLServer utilise les deux tables Inserted et
    Deleted.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 83
    Par défaut
    Justement, ce code vient de MySQL à la base.
    New et Old sont bien supportés.

    Cela ne vient pas non plus d'un problème de droits vu que je teste cela en tant que root, pour éviter ce genre de soucis.

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Le problème doit provenir des END; qui cloture chaque trigger.
    Il me semble qu'il faut commencer par définir un DELIMITER et l'utiliser ensuite entre chaque définition de trigger en lieu et place de END;
    http://dev.mysql.com/doc/refman/5.0/...-triggers.html
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 83
    Par défaut
    Effectivement, c'était bien ça, le delimiter étant le point-virgule par défaut, mysql terminait la requête au premier rencontré

    Merci.

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

Discussions similaires

  1. Problème avec fonctions et triggers
    Par doudou911 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/02/2015, 21h34
  2. Mysql: Problème de trigger
    Par yoshimitsu dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 16/06/2011, 16h06
  3. Trigger sous Mysql : Problème
    Par Aymeeeric dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 25/05/2009, 16h57
  4. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  5. [EJB2.1 Entity] [CMP] [MySQL] Problème avec clé primaire en auto increment
    Par tery dans le forum Java EE
    Réponses: 6
    Dernier message: 16/07/2004, 11h28

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