Jump to content
igor.js167

[Resolvido] Retornar resultados de case em um novo atributo

Recommended Posts

Boa tarde,

 

No banco de dados tenho as informações a seguir, em diferentes tabelas: Acesso,  Dose prescrita, tempo e volume. Preciso, de acordo com essas informações, calcular dois valores chamados bolus e rate seguindo uma condicional. O problema é como vou retornar estes dois valores, se não tem atributo onde eu possa inseri-los?

 

Eu deveria criar uma nova tabela pra eles? Existe como retornar estes atributos sem ter de mexer em nenhuma tabela?

O código atual que tenho, é:

select 
  a.nr_atendimento ATENDIMENTO,
  obter_nome_pf_atend(a.nr_atendimento) NOME,
  obter_data_nascto_pac_atend(a.nr_atendimento) NASCIMENTO,
  'DOSE: ' || decode(a.qt_dose,',5','2.500 UI','1','5.000 UI','1,5','7.500 UI','2','10.000 UI','2,5','12.500 UI','3','15.000 UI','3,5','17.500 UI',
                      '4','20.000 UI','4,5','22.500 UI','5','25.000 UI','5,5','27.500 UI','6','30.000 UI') DOSE,
  'VOLUME: ' || a.qt_volume || ' ml' VOLUME,
  obter_desc_material(a.cd_material) MEDICAMENTO,
  d.qt_hora_min_sessao TEMPO,
  e.nr_seq_tecnica ACESSO
  -- Inserir aqui condicionais para cálculo de BOLUS e RATE 
from 
  CPOE_material a, atend_paciente_unidade b, hd_escala_dialise c, cpoe_dialise d, hd_acesso e
where
  a.cd_material = 49749 and
  a.nr_atendimento = b.nr_atendimento and
  d.nr_atendimento = b.nr_atendimento and
  obter_cd_pes_fis_atend(b.nr_atendimento) = c.cd_pessoa_fisica and
  b.dt_saida_unidade is null and
  a.dt_liberacao is not null and
  a.dt_suspensao is null and
  d.dt_liberacao is not null and
  d.dt_suspensao is null and
  c.dt_fim is null and
  e.cd_pessoa_fisica = obter_pessoa_atendimento(b.nr_atendimento,'C') and
  e.ie_adequado = 'S' and
  e.dt_perda_retirada is null and
  c.nr_seq_turno = :turno and
  c.nr_seq_escala = :escala

E as condicionais que quero inserir é mais ou menos assim:

SE acesso arteriovenoso então:
	se dose_prescrita = 2500 então bolus = volume e rate = '-'
	
	se dose_prescrita = 5000 então:
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,6
		se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,3
		se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,1
	
	se dose_prescrita = 7500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,8
		se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,3
		se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 2,0

	se dose_prescrita = 10000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 4,0
		se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 3,3
		se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,9

	se dose_prescrita = 12500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 5,6
		se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,7
		se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 4,0
	
	se dose_prescrita = 15000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 6,8
		se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 5,7
		se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,9
	
	
	se dose_prescrita = 30000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 14,8
		se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 12,3
		se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 10,6

	se não 
		então null


SE acesso cateter então:
	se dose_prescrita = 2500 então bolus = volume e rate = '-'
	
	se dose_prescrita = 5000 então:
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,3
		se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,1
		se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,0
	
	se dose_prescrita = 7500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,3
		se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,0
		se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 1,8

	se dose_prescrita = 10000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 3,3
		se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 2,9
		se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,5

	se dose_prescrita = 12500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 4,7
		se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,0
		se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 3,5
	
	se dose_prescrita = 15000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 5,7
		se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 4,9
		se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,3
	
	
	se dose_prescrita = 30000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 12,3
		se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 10,6
		se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 9,3

Atenciosamente,

Igor
 

Share this post


Link to post
Share on other sites

Em principio eu faria uma FUNCTION ,

Estes valores da dose_prescrita são assim mesmos discretos (2500 , 5000 etc) ?

Share this post


Link to post
Share on other sites
Agora, Motta disse:

Em principio eu faria uma FUNCTION ,

Estes valores da dose_prescrita são assim mesmos discretos (2500 , 5000 etc) ?

Isso, são padronizados... 2500, 5000, 7500, 10.000 e 12.5000.

 

Vou ter que pesquisar como funciona a criação de função, nunca fiz uma antes

Share this post


Link to post
Share on other sites

Estou tentando criar minha primeira function, já fucei em muito fórum e vídeo aula de ontem pra hoje, mas por algum motivo parece que está sempre faltando alguma coisa pra compilar certinho.
No caso, agora, ele está dando erro no fim do código. ele diz que espera um 'case' depois do end. Mas eu só quero terminar o código e acredito que já dei fim em todos os cases e ifs.

 

Abaixo o código (um pouco extenso, mas é repetitivo):
 

create or replace function calcular_bolus_rate(nr_seq_tecnica number, 
                                               qt_dose number, 
                                               qt_hora_min_sessao varchar2,
                                               qt_volume number, valor_opcao varchar2)
  return varchar2 is

valor_bolus varchar2(5); -- Se valor_opcao = 'b' ou 'B'
valor_rate varchar2(5); -- Se valor opcao = 'r' ou 'R'
valor varchar2(5);

BEGIN
case when nr_seq_tecnica in (4,5,6,8) then
  -- se dose prescrita = 2.500UI
  if qt_dose = ',5' then 
    valor_bolus := to_char(qt_volume, '999');
    valor_rate := '-';
  end if;
  
  -- se dose prescrita = 5.000UI
  if qt_dose = '1' then
    case 
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '6,0';
        valor_rate := '1,6';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '6,0';
        valor_rate := '1,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '6,0';
        valor_rate := '1,1';
      else 
        return null;
      end case;
    end if;
  -- se dose prescrita = 7.500UI
  if qt_dose = '1,5' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
      valor_bolus := to_char(qt_volume, '999');
      valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
      valor_bolus := '8,0';
      valor_rate := '2,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
      valor_bolus := '8,0';
      valor_rate := '2,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
      valor_bolus := '8,0';
      valor_rate := '2,0';
   
    else 
      return null;
    end case;
  end if;
  -- se dose prescrita = 10.00UI
  if qt_dose = '2' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '10,0';
        valor_rate := '4,0';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '10,0';
        valor_rate := '3,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '10,0';
        valor_rate := '2,9';
   
      else
        return null;
      end case;
    end if;
-- se dose prescrita = 12.500UI
  if qt_dose = '2,5' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '11,0';
        valor_rate := '5,6';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '11,0';
        valor_rate := '4,7';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '11,0';
        valor_rate := '4,0';
   
    else
      return null;
    end case;
  end if;

-- se dose prescrita = 15.000UI
  if qt_dose = 3 then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '13,0';
        valor_rate := '6,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '13,0';
        valor_rate := '5,7';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '13,0';
        valor_rate := '4,9';
    
    else
      return null;
    end case;
  end if;

-- se dose prescrita = 30.000UI
  if qt_dose = '6' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '23,0';
        valor_rate := '14,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '23,0';
        valor_rate := '12,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '23,0';
        valor_rate := '10,6';
    
    else
      return null;
    end case;
  end if;
-- Se opção = 'B' ou 'b'
case 
  when valor_opcao = 'b' or valor_opcao = 'B' then
      valor := valor_bolus;
    return valor;
  when valor_opcao = 'r' or valor_opcao = 'R' then
      valor := valor_rate;
    return valor;
  else
    return null;
end case;

return valor;

end;

 

Share this post


Link to post
Share on other sites
1 hora atrás, Motta disse:

Eu trocaria estes "cases" por

 

If xxxx then

Elsif then

Else

End if;

 

https://www.techonthenet.com/oracle/loops/if_then.php

 

 

Obrigado Motta!
Na verdade, eu descobri que o problema foi que eu não tinha fechado o primeiro case e resolvi.
Tentei colocar tudo com if, mas alguns estavam dando alguns problemas no elsif, mas vou tentar novamente depois...

Muito obrigado pelo suporte! Eu estava receoso de tentar algo novo, como functions, mas agora evolui um pouco nos meus conhecimentos de DB e vou praticar mais!

Valeu! :grin:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Motta
      Google e Oracle decidem na Suprema Corte briga judicial sobre Android
    • By Motta
      Oracle lança programa educacional para capacitar jovens na área de TI
    • By Maccio
      Estou tentando criar um relatório com total de horas trabalhadas do funcionários por dia, tenho uma tabela FRQ_digitacao onde eu tenho os dados para calcular o total de horas e se tiver com zero horas eu digo a ocorrência do mesmo, ex: falta, Folga, etc. Quero também colocar a informação de férias quando o mesmo estiver de férias, porém quando ele está de férias a tabela FRQ_digitacao fica sem registros nos dias de Férias, assim tenho que buscar a informação na tabela FLP_Ferias onde é lá que diz o gozoinicial e gozofinal, porém não estou conseguindo fazer essa comparação já que na tabela FRQ_digitacao nesses dias de ferias o funcionário fica sem registro.
       
      select T.CODINTFUNC, f.CHAPAFUNC, LISTAGG( CASE WHEN T.NORMALDIGIT=0 THEN OC.DESCMAPAOCORR WHEN t.DTDIGIT IS NULL THEN 'dt.dtdigit' --when dt.dtdigit between fe.inicio and fe.fim --then 'FER' ELSE to_char((TRUNC(T.NORMALDIGIT)+TRUNC(t.extradigit)+TRUNC(t.extranotdigit))+ ((trunc(((T.NORMALDIGIT-trunc(T.NORMALDIGIT))+(t.extradigit-trunc(t.extradigit))+(t.extranotdigit-trunc(t.extranotdigit)))/0.60))+ mod(((T.NORMALDIGIT - trunc(T.NORMALDIGIT))+(t.extradigit - trunc(t.extradigit))+(t.extranotdigit - trunc(t.extranotdigit))),0.60)),'FM99999D90', 'nls_numeric_characters=''.,''' ) END, ' ') within group (order by t.dtdigit) horas, MAX(FE.INICIO), MAX(FE.FIM ) from vw_funcionarios f, FRQ_DIGITACAOMOVIMENTO O, FRQ_OCORRENCIA OC, frq_digitacao t, (select f.codintfunc INT, f.chapafunc, max(fe.dtcompetfer)COMPET, MAX(fe.gozoinifer) INICIO, MAX(fe.Gozofinfer) FIM from flp_ferias fe, flp_funcionarios f where f.codintfunc=fe.codintfunc AND F.SITUACAOFUNC='A' and f.codigoempresa=1 AND FE.STATUSFERIAS='N' group by f.chapafunc, f.codintfunc) FE, (select t.DTDIGIT from frq_digitacao t WHERE t.dtdigit between '01-NOV-2019' AND '20-NOV-2019' group by t.dtdigit) DT where DT.DTDIGIT(+)=T.dtdigit and fe.INT=t.codintfunc and f.codintfunc=t.codintfunc AND F.CODIGOEMPRESA=1 and O.CODINTFUNC=T.CODINTFUNC AND T.DTDIGIT=O.DTDIGIT AND O.CODOCORR=OC.CODOCORR AND dt.dtdigit BETWEEN '01-NOV-2019' AND '20-NOV-2019' -- AND F.CODDEPTO BETWEEN 15 AND 15 AND O.STATUSDIGIT='N' and o.iddigit = (select max(p.iddigit) from frq_digitacaomovimento p where o.codintfunc=p.codintfunc and o.dtdigit=p.dtdigit AND P.STATUSDIGIT='N' and p.dtdigit between '01-NOV-2019' AND '20-NOV-2019') group by f.CHAPAFUNC, T.CODINTFUNC  



    • By ronimarcos.silva
      Estou com a seguinte situação: No Mysql eu consegui fazer em  "insert into" de uma única vez, com vários registros, conforme abaixo:
      insert into prefeitos (nome, cidade_id) VALUES ('Rodrigo Neves', 2), ('Caique Rosa Baldran', 9), ('Raquel Lira', 11), ('Maísa Albuquerque Sain', 12), ('Zenaldo Coutinho', null); Porém, no Oracle 12C, usando a mesma forma que no Mysql, está dando o seguinte erro: 
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'), ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'), ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'), ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100'); ORA-00933: comando SQL não encerrado adequadamente
      Será que a sintaxe no Oracle é diferente?
       
      Eu sei que assim funciona perfeitamente:
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100');  
      Porém, eu tenho uma tabela com quase 100.000 registros e gostaria de fazer em um único "insert". Eu uso o PL/SQLDeveloper e quando faço o "insert" da forma acima, com vários "insert into", ele abre um novo documento para cada "insert into", nisso ele trava, fica horas rodando o "insert" e não conclui se for em um único "insert" como no Mysql, creio que não pesaria tanto.
      Tem uma forma mais fácil de fazer o "insert into" com muitos dados envolvidos?
      Desde já agradeço.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.