Created
August 10, 2010 07:58
-
-
Save mallain/516880 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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 ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Create a stored procedure which makes a "delta" between two tables.