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 :

Update d'un champ dans plusieurs tables


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut Update d'un champ dans plusieurs tables
    Bonjour à tous !

    Je fais appel à votre savoir car je bloque un peu, j'essaye de créer une procédure stockées pour mettre à jour plusieurs tables et je m'y perd un peu.

    En gros j'ai ajouté un champ sur toutes les tables de ma bdd (pour ceux qui se demande le use case => multitenancy). Mon besoin est maintenant de parcourir toutes les tables qui possèdent cette colonne et de mettre à jour la valeur de chaque entrée (qui est NULL actuellement)

    Je me suis inspiré de ce que j'ai pu voir par ci, par là mais le résultat est décevant => aucune entrée mise à jour :/ Dans la doc j'ai pu lire qu'un cursor est readonly, peut être est-ce la cause de mon problème ?

    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
     
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `update_tenant`(IN `value` INT(1))
     
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE current_table VARCHAR(255);
     
      DECLARE tables_cursor
      CURSOR FOR
      SELECT DISTINCT TABLE_NAME
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_SCHEMA = '<db>'
      AND COLUMN_NAME = 'tenant_id';
     
      DECLARE CONTINUE HANDLER
      FOR NOT FOUND SET done = TRUE;
     
      OPEN tables_cursor;
     
      update_loop: LOOP
        SET done = FALSE;
        FETCH tables_cursor INTO current_table;
     
        IF done THEN
          LEAVE update_loop;
        END IF;
     
        UPDATE current_table SET tenant_id = value; <------- Problem here, note that SELECT CONCAT(current_table, value); looks good
     
      END LOOP update_loop;
      CLOSE tables_cursor;
    END$$
    DELIMITER ;
    Note : n'étant pas mon métier je suis preneur de tous conseils sur les conventions de syntaxe etc (ce que j'ai pu voir est tellement hétérogène, ca n'aide pas)

    Merci beaucoup

  2. #2
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    Bonjour keyga,
    Tu ne peux pas mettre la variable 'current_table' directement dans l'UPDATE, current_table est vu comme le nom de la table a updater et non comme une variable. Tu dois construire ta requête :

    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
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `update_tenant`(IN `value` INT(1))
     
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE current_table VARCHAR(255);
     
      DECLARE tables_cursor CURSOR FOR
    	  SELECT DISTINCT TABLE_NAME
    	  FROM INFORMATION_SCHEMA.COLUMNS
    	  WHERE TABLE_SCHEMA = '<db>'
     	  AND COLUMN_NAME = 'tenant_id';
     
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
      OPEN tables_cursor;
     
      update_loop: LOOP
        FETCH tables_cursor INTO current_table;
     
        IF done THEN
          LEAVE update_loop;
        END IF;
     
        SET @query = CONCAT('UPDATE ', current_table, ' SET tenant_id = ', value);
        PREPARE stmt FROM @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
     
      END LOOP update_loop;
      CLOSE tables_cursor;
    END$$
    DELIMITER ;

  3. #3
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Hello Sebwar,

    la prochaine fois je viendrai demander de l'aide avant Ca marche, merci !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/11/2011, 23h42
  2. Liste déroulante basée sur un même champ dans plusieurs tables
    Par theclaw dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/04/2011, 18h58
  3. trouver un champ dans plusieurs tables
    Par sdblepas dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2009, 14h39
  4. Recherche d'un champ dans plusieurs tables
    Par bogizo dans le forum SQL
    Réponses: 7
    Dernier message: 17/10/2007, 16h33
  5. Sum de plusieurs champs dans plusieurs tables
    Par Cylc dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/10/2006, 10h13

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