Verificar registros em uma mesma data

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
sidney.sato
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 10 Set 2012 12:22 pm

Boa tarde pessoal, sou novo aqui no fórum, e gostaria de agradecer por me deixarem fazer parte dele, espero poder aprender e contribuir com ele.

Estou com um problema aqui no hospital que eu trabalho, eu preciso verificar dentre os atendimentos realizados se algum paciente retornou ao hospital num período de 24 horas.

Para isso eu criei um pl/sql, mas como sou iniciante estou com esta dificuldade em como filtrar estes atendimentos.

Segue abaixo o código.

Selecionar tudo

DECLARE
	CURSOR ao_cur IS
	  SELECT cd_paciente, dt_atendimento
	  FROM atendime
	  WHERE dt_atendimento BETWEEN '01/03/2012' AND '02/03/2012'
                  and tp_atendimento = 'U'
          	  order by cd_paciente, dt_atendimento;
          	
        v_cd_paciente atendime.cd_paciente%TYPE;
        v_data_atendimento atendime.dt_atendimento%TYPE;
        
	
BEGIN
	OPEN ao_cur;
	LOOP
	  FETCH ao_cur INTO v_cd_paciente, v_data_atendimento;
	EXIT WHEN ao_cur%NOTFOUND;
	    DBMS_OUTPUT.PUT_LINE('RA= ' ||v_cd_paciente|| ' Data: '||v_data_atendimento);
	END LOOP;
	CLOSE ao_cur;			
END;
Dentro do cursor o que eu poderia utilizar para fazer a filtragem destes dados?

Desde já agradeço pela atenção.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

você diz incluir parâmetros no cursor???
Olha:
http://www.techonthenet.com/oracle/cursors/declare.php

Qualquer dúvida, postae.
carloscsilva
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Qui, 26 Jul 2012 8:55 am
" Pense diferente! - "

Não entendi muito bem! Mas ... Caso seja criar algo com parâmetro ... é simples, segue abaixo.

Selecionar tudo

create or replace procedure prc_atendimento(p_dt_inicio in date,
                                                                           p_dt_fim     in date) is

  CURSOR ao_cur IS       SELECT cd_paciente, dt_atendimento
                                   FROM atendime
                                  WHERE dt_atendimento BETWEEN p_dt_inicio AND p_dt_fim
                                      and tp_atendimento = 'U'
                               order by cd_paciente, dt_atendimento;
             
  v_cd_paciente            atendime.cd_paciente%TYPE;
  v_data_atendimento     atendime.dt_atendimento%TYPE;
        
   
BEGIN
   OPEN ao_cur;
   LOOP
     FETCH ao_cur INTO v_cd_paciente, v_data_atendimento;
   EXIT WHEN ao_cur%NOTFOUND;
       DBMS_OUTPUT.PUT_LINE('RA= ' ||v_cd_paciente|| ' Data: '||v_data_atendimento);
   END LOOP;
   CLOSE ao_cur;         
END;
Para executar.:

Selecionar tudo

exec prc_atendimento('01/03/2012','02/03/2012');
sidney.sato
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 10 Set 2012 12:22 pm

Olá, na verdade não é criar parâmetros, mas sim fazer as comparações dos dados do cursor, por exemplo existe um paciente de codigo(cd_paciente) = 12345, o que eu quero é verificar se este mesmo paciente deu entrada no hospital novamente em menos de 24 horas, ou seja eu compararia as datas, e o código do paciente. Se este paciente = 12345, aparecesse 2 vezes na mesma data, me mostrasse esses registros.
Não sei se eu expliquei direitinho.

Obrigado.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Ainda não sei se entendi. Você pode dentro do LOOP fazer o que quiser, pegar os valores do cursor e fazer o que sua imaginação quiser (sem gambiarras, hehehe).

Mas seria algo tipo:

Selecionar tudo

LOOP
     FETCH ao_cur INTO v_cd_paciente, v_data_atendimento;
   EXIT WHEN ao_cur%NOTFOUND;
       DBMS_OUTPUT.PUT_LINE('RA= ' ||v_cd_paciente|| ' Data: '||v_data_atendimento);

     SELECT X
        INTO Y
        FROM AAA
     WHERE paciente_id = v_cd_paciente;
         AND (v_data_atendimento - data) < 1
   END LOOP;
sidney.sato
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 10 Set 2012 12:22 pm

Já estão me ajudando bastante Noctifero e Carlos, mas vou tentar explicar de novo. O hospital atende no pronto socorro 24 horas, eles precisam de um relatório que eu indicando uma data inicial e uma data final, pegue entre essas datas indicadas os pacientes que retornaram ao hospital para atendimento 2 ou mais vezes em menos de 24 horas.
A principio eu pensei em criar um cursor para pegar todos os atendimentos e depois fazer um if comparando todos os cd_pacientes, o cd_paciente é único, então compararia a data e o cd_paciente. Porém por falta de experiência e conhecimento, não estou conseguindo imaginar como realizar essa comparação e mostrar o resultado.
A saída seria o RA(registro de atendimento) e a data.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Hmmm.
Se for no mesmo dia é mais fácil, seria algo assim:

Selecionar tudo

select t.paciente, trunc(t.data_entrada) , count(distinct t.RA)
  from atendimento t
 group by t.paciente, trunc(t.data_entrada)
 having count(distinct t.RA) > 1;
Agora se precisar da diferença de 24 horas, o buraco é mais embaixo, pois tem que comparar as datas. Mas é possível utilizar algumas funções analíticas para ajudar nesta análise.
No aguardo.
sidney.sato
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 10 Set 2012 12:22 pm

Deu certo aqui Noctifero, muito obrigado, vou deixar a pl aqui se alguém algum dia precisar, vlw mesmo, abraços.

Selecionar tudo

DECLARE
  2  	CURSOR ao_cur IS
  3  	  select cd_paciente, trunc(dt_atendimento) , count(cd_paciente)
  4            from atendime t
  5            where dt_atendimento BETWEEN '01/03/2012' AND '29/03/2012'
  6            and tp_atendimento = 'U'
  7            group by cd_paciente, trunc(dt_atendimento)
  8            having count(cd_paciente) > 1;
  9  
 10          v_cd_paciente atendime.cd_paciente%TYPE;
 11          v_data_atendimento atendime.dt_atendimento%TYPE;
 12          v_count_atendimento atendime.cd_paciente%TYPE;
 13  
 14  
 15  BEGIN
 16  	OPEN ao_cur;
 17  	LOOP
 18  	  FETCH ao_cur INTO v_cd_paciente, v_data_atendimento, v_count_atendimento;
 19  	EXIT WHEN ao_cur%NOTFOUND;
 20  	  DBMS_OUTPUT.PUT_LINE('RA= ' ||v_cd_paciente|| ' Data: '||v_data_atendimento);
 21  	END LOOP;
 22  	CLOSE ao_cur;
 23  END;
 24  /
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes