Mise à jour massive multi-tables MySQL utilisant une procédure stockée

Ce billet est un pur mémo, un quasi copier-coller. Et je n’ai pas trouver un autre titre, aussi générique et banal soit-il.

Pour l’un de mes projets principaux (un système de gestion de pièces de rechange/entrepôt), un gros changement m’a été demandé. Celui-ci, parmi d’autres choses, implique une modification du format du code barre des biens dans la base de données, et ce champ est une clé primaire, donc point délicat.

Le code barre était auto-généré en utilisant les premiers 6 caractères du code fournisseur – si existant – complétés par des zéros, puis un entier incrémenté, toujours complété par des zéros. Il existe donc différentes « typographies » de codes barres, avec et sans caractères alphabétiques : 0000002598 et DMP0000666 peuvent exister.
Maintenant ce code barre est plus simple, il s’agit juste d’un entier incrémenté.

Vous pouvez découvrir comment j’ai procédé pour construire une procédure stockée faisant cette mise-à-jour massive en lisant les commentaires de celle-ci.

CREATE DEFINER=`fabien`@`localhost` PROCEDURE `update_barcode`(
)
BEGIN

	# Déclaration de variables
	DECLARE cur_alpha_stop INT;
	DECLARE old_barcode VARCHAR(128);
	DECLARE next_barcode VARCHAR(128);
	DECLARE new_barcode VARCHAR(128);

	# Declaration d'un curseur pour les codes barres contenant des caractères alpha-numériques
	DECLARE cur_alpha CURSOR FOR SELECT barcode FROM goods WHERE barcode REGEXP '[a-zA-Z]';	
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur_alpha_stop = 1;

	SET cur_alpha_stop = 0;

	# Obtenir le prochain codes barre numérique
	SET next_barcode = (SELECT max(barcode)+1 FROM goods WHERE barcode REGEXP '^[0-9]+$');
	
	# Ouvre le curseur
	OPEN cur_alpha;

	# Traverse les enregistrements
	WHILE cur_alpha_stop = 0 DO
		# On récupère le code barre de l'enregistrement où se trouve le curseur
		FETCH cur_alpha INTO old_barcode;

		# Le format du code barre est complété à 10 caractères par des zéros
		SET new_barcode = ( SELECT lpad(next_barcode, 10, 0) );

		# Mises-à-jour des tables
		UPDATE goods SET barcode = new_barcode WHERE barcode = old_barcode;
		UPDATE client SET good_barcode = new_barcode WHERE good_barcode = old_barcode;
		UPDATE supplier_cn_good SET good_barcode = new_barcode WHERE good_barcode = old_barcode;
		
		# Cette ligne sert juste pour avoir un retour visuel de chaque update
		# durant les phases de test, en production elle peut-être commentée
		SELECT concat(concat(old_barcode, ' --> '), new_barcode);

		# Incrémentation du numéro de barre code
		SET next_barcode = next_barcode+1;
	END WHILE;

	# Fermeture du curseur
	CLOSE cur_alpha;

END

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *