· 8 years ago · Nov 22, 2017, 05:00 PM
1CREATE TABLE `ocorrencias_historico` (
2 `id` INT(11) NOT NULL AUTO_INCREMENT,
3 `ocorrencia_id` INT(11) NOT NULL,
4 `status` INT(11) NOT NULL,
5 `data_acao` DATE NOT NULL,
6 `hora_acao` TIME NOT NULL,
7 PRIMARY KEY (`id`)
8)
9
10|| *id* || *status* || *data_acao* || *hora_acao* || *ocorrencia_id*
11|| 3 || 1 || 2017-11-22 || 11:07:39 || 77971
12|| 4 || 2 || 2017-11-22 || 11:08:22 || 77971
13|| 5 || 8 || 2017-11-22 || 11:08:57 || 77971
14
15DELIMITER $$
16DROP FUNCTION IF EXISTS fn_calculo_sla $$
17CREATE FUNCTION fn_calculo_sla(prm_ocorrencia_id INT) RETURNS DOUBLE
18READS SQL DATA
19BEGIN
20
21-- <inicio_declaracoes>
22
23 -- declara variaveis de associação para usar no loop
24 DECLARE var_status INT(11);
25 DECLARE var_data_acao DATE;
26 DECLARE var_hora_acao TIME;
27
28 -- declara variaveis de associação para utilizar para buscar o próximo registro com base no atual
29 DECLARE var_status_next INT(11);
30 DECLARE var_data_acao_next DATE;
31 DECLARE var_hora_acao_next TIME;
32
33 -- declara variaveis de controle
34 DECLARE done TINYINT(1) DEFAULT FALSE; -- para uso no CURSOR
35 DECLARE tempo_total DOUBLE DEFAULT 0;
36
37 -- declara cursores
38 DECLARE dados_historico CURSOR FOR SELECT `status`, data_acao, hora_acao FROM ocorrencias_historico WHERE ocorrencia_id = prm_ocorrencia_id order by data_acao, hora_acao;
39
40 -- outros
41 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- quando não tiver mais registros no CURSOR aberto a variavel 'done' recebe true
42
43-- <fim_declaracoes>
44
45 OPEN dados_historico; -- abre o CURSOR e seleciona os registros e associa
46
47 read_loop: LOOP -- declara a região de LOOP para percorrer o cursor
48
49 -- REGISTRO ATUAL
50 FETCH dados_historico INTO var_status, var_data_acao, var_hora_acao; -- Associa a linha atual do registro nas variaveis, obedecer a ordem do SELECT
51
52 IF done THEN -- Verificar se ainda há registros
53 LEAVE read_loop; -- Sair do loop
54 END IF;
55
56 -- PROXIMO REGISTRO
57 FETCH NEXT FROM dados_historico INTO var_status_next, var_data_acao_next, var_hora_acao_next;-- Associa a próxima linha do registro nas variaveis, obedecer a ordem do SELECT
58
59 IF done THEN -- Verificar se ainda há registros na próxima posição
60 LEAVE read_loop; -- Sair do loop
61 ELSE
62 SET tempo_total = tempo_total + TIMESTAMPDIFF(MINUTE, CONCAT(var_data_acao,' ',var_hora_acao), CONCAT(var_data_acao_next,' ',var_hora_acao_next));
63 END IF;
64
65 END LOOP;
66
67 CLOSE dados_historico;
68
69 RETURN tempo_total;
70END
71$$
72DELIMITER ;