Skip to content

Instantly share code, notes, and snippets.

@mallain
Created August 10, 2010 07:58
Show Gist options
  • Save mallain/516880 to your computer and use it in GitHub Desktop.
Save mallain/516880 to your computer and use it in GitHub Desktop.
-- Use database
USE pabd_olap;
-- Suppression de la procedure si elle existe
DROP PROCEDURE IF EXISTS sp_maj_referentiel_agences;
-- Changement du parametre "delimiter" pour creer la procedure
DELIMITER $$
-- Creation de la procedure sp_maj_referentiel_gen
-- id_tpa_tables : Represente la clef primaire pour specifier la source et la distination du traitement
CREATE PROCEDURE sp_maj_referentiel_agences()
BEGIN
#############################
# DECLARATION VARIABLES LOCALES #
#############################
/* Declaration de variables locale pour le curseur*/
DECLARE lv_id INT UNSIGNED;
DECLARE lv_field VARCHAR(255);
DECLARE lv_field2 VARCHAR(255);
/* Declaration de variables pour les handlers */
DECLARE duplicate_key INT DEFAULT 0;
DECLARE foreign_key INT DEFAULT 0;
DECLARE fetched INT DEFAULT 0;
/* Declaration du curseur "tmp_cursor" */
DECLARE tmp_cursor CURSOR FOR
SELECT DISTINCT
s.ID_AGENCE
, s.NOM_AGENCE
, s.ID_DIVISION
FROM TMP_AGENCES s LEFT JOIN TDI_AGENCES d
ON s.ID_AGENCE = d.ID_AGENCE;
#############
# HANDLERS #
#############
/* Les handlers doivent etre obligatoirement apres les definitions de curseurs */
/* Declaration du handler pour la contrainte du type "cles dupliquees" */
DECLARE CONTINUE HANDLER FOR 1062 SET duplicate_key = 1;
/* Declaration du handler pour la contrainte du type "cles etrangeres" */
DECLARE CONTINUE HANDLER FOR 1216 SET foreign_key = 1;
/* Declaration du handler pour catcher l erreur lorsque le curseur ne contient aucune donnees */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetched = 1;
/* Mode autocommit OFF*/
START TRANSACTION;
/* Creation d un point de sauvegarde */
SAVEPOINT initpoint;
/* Ouverture de notre curseur */
OPEN tmp_cursor;
########################
# TRAITEMENT DU CURSEUR #
########################
/* Boucle pour parcourir le curseur*/
loop_cursor: LOOP
/* Chaque resultat du curseur est mis dans une variable locale de notre procedure */
FETCH tmp_cursor
INTO lv_id
, lv_field
, lv_field2;
/* Si le Handler de verification de presence de donnees a leve une exception */
IF fetched = 1 THEN
/* On sort de la boucle*/
LEAVE loop_cursor;
END IF;
/* Insertion des donnees sources dans la table cible*/
INSERT INTO TDI_AGENCES
VALUES
( lv_id
, lv_field
, lv_field2 )
ON DUPLICATE KEY
UPDATE TDI_AGENCES.NOM_AGENCE = lv_field
, TDI_AGENCES.ID_DIVISION = lv_field2;
END LOOP loop_cursor;
/* Fermeture de notre curseur*/
CLOSE tmp_cursor;
####################################
# VERIFICATION DE LA PRESENCE D ERREURS #
####################################
/* Si il y a eu de problemes de duplication de cles ou de cles etrangeres */
IF duplicate_key = 1 OR foreign_key = 1 THEN
/* Nous revenons a l etat du point de sauvegarde */
ROLLBACK TO SAVEPOINT initpoint;
ELSE
/* Commit des modifications*/
COMMIT;
END IF;
END;
$$
-- Remise a l etat initial du parametre "delimiter"
DELIMITER ;
@mallain
Copy link
Author

mallain commented Aug 10, 2010

Create a stored procedure which makes a "delta" between two tables.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment