· 8 years ago · Jun 03, 2018, 10:00 PM
1-- Use database
2USE pabd_olap;
3
4-- Suppression de la procedure si elle existe
5DROP PROCEDURE IF EXISTS sp_maj_referentiel_agences;
6
7-- Changement du parametre "delimiter" pour creer la procedure
8DELIMITER $$
9
10-- Creation de la procedure sp_maj_referentiel_gen
11-- id_tpa_tables : Represente la clef primaire pour specifier la source et la distination du traitement
12CREATE PROCEDURE sp_maj_referentiel_agences()
13
14BEGIN
15
16 #############################
17 # DECLARATION VARIABLES LOCALES #
18 #############################
19
20 /* Declaration de variables locale pour le curseur*/
21 DECLARE lv_id INT UNSIGNED;
22 DECLARE lv_field VARCHAR(255);
23 DECLARE lv_field2 VARCHAR(255);
24
25 /* Declaration de variables pour les handlers */
26 DECLARE duplicate_key INT DEFAULT 0;
27 DECLARE foreign_key INT DEFAULT 0;
28 DECLARE fetched INT DEFAULT 0;
29
30 /* Declaration du curseur "tmp_cursor" */
31 DECLARE tmp_cursor CURSOR FOR
32 SELECT DISTINCT
33 s.ID_AGENCE
34 , s.NOM_AGENCE
35 , s.ID_DIVISION
36 FROM TMP_AGENCES s LEFT JOIN TDI_AGENCES d
37 ON s.ID_AGENCE = d.ID_AGENCE;
38
39 #############
40 # HANDLERS #
41 #############
42
43 /* Les handlers doivent etre obligatoirement apres les definitions de curseurs */
44
45 /* Declaration du handler pour la contrainte du type "cles dupliquees" */
46 DECLARE CONTINUE HANDLER FOR 1062 SET duplicate_key = 1;
47 /* Declaration du handler pour la contrainte du type "cles etrangeres" */
48 DECLARE CONTINUE HANDLER FOR 1216 SET foreign_key = 1;
49 /* Declaration du handler pour catcher l erreur lorsque le curseur ne contient aucune donnees */
50 DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetched = 1;
51
52 /* Mode autocommit OFF*/
53 START TRANSACTION;
54
55 /* Creation d un point de sauvegarde */
56 SAVEPOINT initpoint;
57
58 /* Ouverture de notre curseur */
59 OPEN tmp_cursor;
60
61 ########################
62 # TRAITEMENT DU CURSEUR #
63 ########################
64
65 /* Boucle pour parcourir le curseur*/
66 loop_cursor: LOOP
67
68 /* Chaque resultat du curseur est mis dans une variable locale de notre procedure */
69 FETCH tmp_cursor
70 INTO lv_id
71 , lv_field
72 , lv_field2;
73
74 /* Si le Handler de verification de presence de donnees a leve une exception */
75 IF fetched = 1 THEN
76 /* On sort de la boucle*/
77 LEAVE loop_cursor;
78 END IF;
79
80 /* Insertion des donnees sources dans la table cible*/
81 INSERT INTO TDI_AGENCES
82 VALUES
83 ( lv_id
84 , lv_field
85 , lv_field2 )
86 ON DUPLICATE KEY
87 UPDATE TDI_AGENCES.NOM_AGENCE = lv_field
88 , TDI_AGENCES.ID_DIVISION = lv_field2;
89
90 END LOOP loop_cursor;
91
92 /* Fermeture de notre curseur*/
93 CLOSE tmp_cursor;
94
95 ####################################
96 # VERIFICATION DE LA PRESENCE D ERREURS #
97 ####################################
98
99 /* Si il y a eu de problemes de duplication de cles ou de cles etrangeres */
100 IF duplicate_key = 1 OR foreign_key = 1 THEN
101 /* Nous revenons a l etat du point de sauvegarde */
102 ROLLBACK TO SAVEPOINT initpoint;
103 ELSE
104 /* Commit des modifications*/
105 COMMIT;
106 END IF;
107
108END;
109$$
110
111-- Remise a l etat initial du parametre "delimiter"
112DELIMITER ;