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

MySQL Discussion :

Déclenchement d'une Procédure Stockée


Sujet :

MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Déclenchement d'une Procédure Stockée
    Bonjour à tous,

    Je cherche à déclencher une procédure stockée de manière automatique, comme avec un trigger.
    En gros, ma procédure stockée créée une table Tb3 qui est le résultat d'une requête entre Tb1 et Tb2. Je voudrais recalculer automatiquement la table Tb3 à chaque modification/insertion/suppression de données dans Tb1 et/ou Tb2... Comment puis-je faire ?
    (Nota : je ne peux pas gérer Tb3 comme une vue car la requête de création de Tb3 contient une requête imbriquée, et donc n'est pas gérée par mySQL : The SELECT statement cannot contain a subquery in the FROM clause )
    Je sèche...

    Merci d'avance pour les idées !

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par boris_atw Voir le message
    Bonjour à tous,

    Je cherche à déclencher une procédure stockée de manière automatique, comme avec un trigger.
    ... Comment puis-je faire ?
    tu fais des triggers.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Antoun Voir le message
    tu fais des triggers.
    Bonjour et merci pour cette réponse aussi inutile que sans intérêt...

    Ma question initiale portait sur le déclenchement automatique d'une fonction. Si je peux le faire avec un trigger (ce dont je doute, mais j'espère me tromper) je ne comprends pas la manière de le déclarer dans mon trigger. Si ce n'est pas possible avec un trigger, y aurait-il un autre moyen ?
    Dans un cas comme dans l'autre, déclarez "fais des triggers" m'est aussi utile que de dire "fait des claquettes devant ton pc, ca va marcher".

    Cordialement,
    Boris

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je voulais juste te dire que tu prenais les choses par le mauvais bout. Une procédure qui se déclenche automatiquement sur des événements tels qu'une mise à jour de donnée, ça s'appelle un trigger. Ta question est en gros "je voudrais faire une voiture, mais qui se déplace sous l'eau comme un sous-marin plutôt que de rouler sur terre", donc la seule réponse qu'on peut te faire c'est "laisse tomber tes histoires de bagnole, si tu veux un sous-marin, fais un sous-marin".

    Si je peux le faire avec un trigger (ce dont je doute, mais j'espère me tromper) je ne comprends pas la manière de le déclarer dans mon trigger.
    C'est difficile de te dire comment faire sans les éléments ! Je te propose de nous donner le code de ta procédure, et j'essaierai de te montrer comment on peut soit la transformer en trigger, soit l'appeler depuis un trigger.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ok, désolé de m'être mal exprimé
    Bien, si je résume mon problème :
    J'ai une table tb1 : code / date / valeur1 / valeur2
    et une autre table tb2 : code / date / valeur3 / valeur4
    Pour faire la synthèse de tb1, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select code, sum(valeur1), sum(valeur2) group by code
    = ok, pas de souci.
    Même chose pour tb2, en changeant tb1 par tb2 et les champs de valeur = ok, pas de souci.

    Comme les tables tb1 et tb2 peuvent contenir de nombreux enregistrements, je cherche à créer une table tbSum qui contienne en permanence la synthèse des deux tables, à savoir : code / sumVal1 / sumVal2 / sumVal3 / sumVal4. Dans un autre SGBD que mySQL, j'aurais fait une vue (puisqu'il s'agit bien de cela !). Mais la requete de création de tbSum imbrique des requêtes, et donc je ne peux pas générer de vue à partir de ces 2 tables

    L'idée suivante est donc de créer une procédure stockée (disons PS_SUM) contenant les requêtes imbriquées et qui serait déclenchée lors de toute modification sur l'une des 2 tables. Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER TRIG1 AFTER INSERT ON tb1
         CALL PS_SUM;
    C'est bien là où je doute que ce soit possible de cette façon.

    Serait-il possible de faire un trigger qui se charge d'exécuter la requête directement ??? (sans passer par une procédure stockée), comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER TRIG2 AFTER INSERT ON tb1
        create table tb3 select .....;
    Je connais très mal (pas du tout ?) la syntaxe des triggers sous mySQL et j'ai peur de m'embarquer à perdre du temps à essayer de faire un truc qui ne va pas marcher...
    Merci de m'avoir lu jusqu'ici et d'éclairer ma faible lanterne

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Peux-tu mettre le code de ta proc avec la requête imbriquée ? Il y a peut-être moyen de la réécrire pour la rendre compatible avec une vue...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Peux-tu mettre le code de ta proc avec la requête imbriquée ? Il y a peut-être moyen de la réécrire pour la rendre compatible avec une vue...
    Bien sûr !
    Pour mémoire tb1 = code / date / val1, val2 et tb2 = code / date / val3 / val4
    Les tables contiennent des données différentes relatives au code. Evidemment, impossible pour diverses raisons de les merger en une seule table...(cela serait trop simple sinon !)

    Le code de la proc stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table tbSum select 
    tb.code, sum(tb.val1) as val1, sum(tb.val2) as val2, sum(tb.val3) as val3, sum(tb.val4) as val4 
    from 
    (select tb1.code, tb1.val1 as val1, tb1.val2 as val2, NULL as val3, NULL as val4 
    from tb1 union all 
    select tb2.code, NULL as val1, NULL as val2, tb2.val3 as val3, tb2.val4 as val4 from tb2) as tb 
    group by tb.code
    Merci pour l'aide !

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je pense que tu peux le jouer en imbriquant des vues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE VIEW tbSum0
    AS
    SELECT tb1.code, tb1.val1 AS val1, tb1.val2 AS val2, NULL AS val3, NULL AS val4 
    FROM tb1 union ALL 
    SELECT tb2.code, NULL AS val1, NULL AS val2, tb2.val3 AS val3, tb2.val4 AS val4 FROM tb2 ;
     
    CREATE VIEW tbSum 
    AS
    SELECT code, val1, val2, val3, val4 
    FROM tbSum0
    GROUP BY code ;

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Je pense que tu peux le jouer en imbriquant des vues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE VIEW tbSum0
    AS
    SELECT tb1.code, tb1.val1 AS val1, tb1.val2 AS val2, NULL AS val3, NULL AS val4 
    FROM tb1 union ALL 
    SELECT tb2.code, NULL AS val1, NULL AS val2, tb2.val3 AS val3, tb2.val4 AS val4 FROM tb2 ;
     
    CREATE VIEW tbSum 
    AS
    SELECT code, val1, val2, val3, val4 
    FROM tbSum0
    GROUP BY code ;
    Très ingénieux !!
    Adapté à mon code, cela marche impeccable
    Merci beaucoup pour toute l'aide !!

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Juste pour ta culture, quelques réponses sur la solution trigger (mais a priori, la vue te conviendra mieux) :

    Citation Envoyé par boris_atw Voir le message
    L'idée suivante est donc de créer une procédure stockée (disons PS_SUM) contenant les requêtes imbriquées et qui serait déclenchée lors de toute modification sur l'une des 2 tables. Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER TRIG1 AFTER INSERT ON tb1
         CALL PS_SUM;
    C'est bien là où je doute que ce soit possible de cette façon.
    En théorie, ça ne pose pas de problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TRIGGER TRIG1 AFTER INSERT ON tb1
    FOR EACH ROW
    CALL PS_SUM() ;
    En pratique, le gag est que MySQL ne connaît que les triggers FOR EACH ROW, autrement dit si un jour tu envoies 100 lignes d'un coup dans l'une de tes tables, il appelera la procédure 100 fois de suite...

    Citation Envoyé par boris_atw Voir le message
    Serait-il possible de faire un trigger qui se charge d'exécuter la requête directement ??? (sans passer par une procédure stockée), comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TRIGGER TRIG2 AFTER INSERT ON tb1
        create table tb3 select .....;
    Les triggers (et les fonctions) n'ont pas le droit de faire du DDL, donc pas de CREATE. Par contre, tu peux sans problème vider et re-remplir une table existante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TRIGGER TRIG2 AFTER INSERT ON tb1
    FOR EACH ROW
    BEGIN 
      DELETE FROM tbSum ;
      INSERT INTO tbSum 
      select tb.code, sum(tb.val1) as val1, sum(tb.val2) as val2, sum(tb.val3) as val3, sum(tb.val4) as val4 
      from blabla ... ;
    END ;
    A nouveau, tu retrouverais le gag du déclenchement à chaque ligne insérée.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Juste pour ta culture, quelques réponses sur la solution trigger (mais a priori, la vue te conviendra mieux) :
    Oui, en effet, l'enchainement des 2 vues est beaucoup plus adaptée dans le cas présent.
    J'ai testé votre solution avec trigger, et effectivement, comme il y a de gros volume de données, lors de l'insertion d'un batch massif de valeurs, le serveur était un peu à genoux...
    Donc, je garde définitivement la solution des vues et vous remercie encore pour toute votre aide et le partage de vos compétences
    Cordialement,
    Boris

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Marquer une pause dans une procédure stockée
    Par PéPénet dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/11/2003, 10h42
  3. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31
  4. Réponses: 12
    Dernier message: 27/08/2003, 11h04
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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