· 6 years ago · Aug 21, 2019, 02:28 PM
1/* Implementare un event che sposti mensilmente le terapie terminate oltre sei mesi prima in una tabella di
2archivio ARCHIVIOTERAPIE mediante una stored procedure dump_therapies(). Salvare in ARCHIVIOERAPIE il
3codice fiscale del paziente, la patologia, il nome commerciale del farmaco, l'anno d'inizio, la durata
4della terapia in giorni e il numero totale di compresse assunte. L'event deve salvare in una tabella
5persistente la data dell'ultima volta in cui è andato in esecuzione e il numero di terapie archiviate */
6
7CREATE TABLE ArchivioTerapie (
8 Paziente VARCHAR(100) NOT NULL,
9 Patologia VARCHAR(100) NOT NULL,
10 Farmaco VARCHAR(100) NOT NULL,
11 AnnoInizio DATE NOT NULL,
12 DurataTerapia INTEGER,
13 NumCompresse INTEGER,
14 PRIMARY KEY (Paziente)
15) ENGINE = InnoDB DEFAULT CHARSET = latin1;
16
17CREATE TABLE LastUpdate (
18 Data DATE,
19 NumTerapie INTEGER NOT NULL,
20 PRIMARY KEY (Data, NumTerapie)
21) ENGINE = InnoDB DEFAULT CHARSET = latin1;
22
23
24DROP PROCEDURE IF EXISTS dump_therapies;
25DELIMITER $$
26CREATE PROCEDURE dump_therapies(OUT NumTerapie INT)
27BEGIN
28 DECLARE finito INTEGER DEFAULT 0;
29 DECLARE paziente VARCHAR(100) DEFAULT '';
30 DECLARE patologia VARCHAR(100) DEFAULT '';
31 DECLARE farmaco VARCHAR(100) DEFAULT '';
32 DECLARE AnnoInizio INTEGER DEFAULT 2019;
33 DECLARE durata INTEGER DEFAULT 0;
34 DECLARE posologia INTEGER DEFAULT 0;
35 DECLARE numCpr INTEGER DEFAULT 0;
36
37 DECLARE CursoreTerapie CURSOR FOR
38 SELECT T.Paziente,
39 T.Patologia,
40 T.Farmaco,
41 YEAR(T.DataInizioTerapia),
42 DATEDIFF(DataFineTerapia, DataInizioTerapia) AS Durata,
43 Posologia, -- Da moltiplicare con la durata
44 T.DataEsordio,
45 T.DataInizioTerapia
46 FROM Terapia T
47 WHERE PERIOD_DIFF( DATE_FORMAT(T.DataInizioTerapia, '%Y%m'),
48 DATE_FORMAT(T.DataFineTerapia, '%Y%m')
49 ) > 6;
50
51 DECLARE CONTINUE HANDLER FOR NOT FOUND SET finito = 1;
52
53 OPEN CursoreTerapie;
54
55 scan: LOOP
56 FETCH CursoreTerapie INTO paziente, patologia, farmaco, AnnoInizio, durata, posologia, DataEsordio, DataInizioTerapia;
57
58 IF finito = 1 THEN
59 LEAVE scan;
60 END IF;
61
62 SET numCpr = posologia * durata;
63 SET NumTerapie = NumTerapie + 1;
64
65 INSERT INTO ArchivioTerapie
66 VALUES (paziente, patologia, farmaco, AnnoInizio, durata, numCpr);
67
68 DELETE T.*
69 FROM Terapia T
70 WHERE T.Paziente = paziente
71 AND T.Patologia = patologia
72 AND T.DataEsordio = DataEsordio
73 AND T.Farmaco = farmaco
74 AND T.DataInizioTerapia = DataInizioTerapia;
75
76 END LOOP scan;
77
78
79END $$
80
81CREATE EVENT sposta ON SCHEDULE EVERY 1 MONTH
82DO
83 BEGIN
84 CALL dump_therapies(@NTerapie);
85 INSERT INTO LastUpdate
86 VALUES ( CURRENT_DATE, @NTerapie);
87 END $$
88DELIMITER ;