· 6 years ago · Sep 06, 2019, 11:08 AM
1DROP PROCEDURE IF EXISTS healthy_patients_in_period;
2DELIMITER $$
3
4CREATE PROCEDURE healthy_patients_in_period (IN _from DATE, IN _to DATE)
5BEGIN
6 /*DECLARE paziente VARCHAR(30) DEFAULT '';
7 DECLARE giorniPrima INT DEFAULT 0;
8 DECLARE giorniDopo INT DEFAULT 0;
9 DECLARE finito INT DEFAULT 0;
10 */
11 CREATE TEMPORARY TABLE PazientiTarget(
12 Paziente VARCHAR(30) NOT NULL,
13 SanoPrima INT NOT NULL,
14 SanoDopo INT NOT NULL,
15 PRIMARY KEY (Paziente)
16 );
17
18 -- DECLARE cursorePaz CURSOR FOR
19 INSERT INTO PazientiTarget
20 SELECT DISTINCT P.CodFiscale, DATEDIFF( _from,
21 IFNULL((SELECT MAX(T2.DataFineTerapia)
22 FROM terapia T2
23 WHERE T2.DataFineTerapia < _from
24 AND T2.Paziente = P.CodFiscale)
25 , P.DataNascita)
26 ) AS GiorniSanoBefore,
27 DATEDIFF(
28 IFNULL((SELECT MIN(T3.DataInizioTerapia)
29 FROM terapia T3
30 WHERE T3.DataInizioTerapia > _to
31 AND T2.Paziente = P.CodFiscale)
32 , CURRENT_DATE())
33 ) AS GiorniSanoAfter
34 FROM paziente P
35 WHERE P.CodFiscale NOT IN ( -- pazienti sani in quel periodo
36 SELECT DISTINCT T.Paziente
37 FROM terapia T
38 WHERE T.DataInizioTerapia BETWEEN _from AND _to
39 OR T.DataFineTerapia BETWEEN _from AND _to
40 OR (T.DataInizioTerapia < _from AND T.DataFineTerapia IS NULL)
41 );
42 /*DECLARE CONTINUE HANDLER FOR NOT FOUND
43 SET finito = 1;*/
44
45 IF _from > _to OR _from IS NULL OR _to IS NULL THEN
46 SIGNAL SQLSTATE '45000'
47 SET MESSAGE_TEXT = "Errore, input non valido!";
48 END IF;
49
50 CREATE TEMPORARY TABLE PazientiTarget(
51 Paziente VARCHAR(30) NOT NULL,
52 SanoPrima INT NOT NULL,
53 SanoDopo INT NOT NULL,
54 PRIMARY KEY (Paziente)
55 );
56
57END $$