Euler.

Consegui refinar com ajuda do programador (desculpe a demora)
exatamente em ordem as consultas que são executadas no momento que o
sistema abre a central de operações (nosso software controla uma frota
de ambulâncias). Acho que está mais fácil de entender agora.

Existem alguns muitos problemas nesse sistema que como disse é legado,
e ainda não consegui resolver muitos dos problemas de acesso ao banco.
O que está me assustando é o fato de aparecer esse erro de tid
simplesmente trocando a plataforma.

João Paulo: se estiver lendo esse email tem como tentar me dar uma
força? Pensei em te mostrar essa situação em off, mas acho mais
produtivo na lista (vai que alguém também se depara com algo
semelhante).

Segue a consulta:

-- insere as equipes no plantao do dia
BEGIN;
insert into servico_recursos_operantes (
   cod_plantao,
   cod_rf,
   cod_base,
   cod_medico,
   medico_escalado,
   cod_auxiliar,
   cod_motorista,
   destinacao,
   tipo_recurso,
   dthinicio_plantao,
   dthtermino_plantao,
   checado,
   status,
   iniciando_plantao,
   terminando_plantao,
   plantao_concluido,
   cod5,
   ns_realizados,
   id_nextel,
   check_medico,
   check_auxiliar,
   check_motorista,
   entrada_medico,
   entrada_auxiliar,
   entrada_motorista
)

select
   servico_escala_equipes.cod_plantao,
   servico_escala_equipes.cod_rf,
   servico_recursos_fisicos.cod_base,
   case when servico_escala_equipes.cod_medico is not null then
servico_escala_equipes.cod_medico else 0 end,
   case when servico_escala_equipes.cod_medico is not null then
servico_escala_equipes.cod_medico else 0 end,
   case when servico_escala_equipes.cod_auxiliar is not null then
servico_escala_equipes.cod_auxiliar else 0 end,
   case when servico_escala_equipes.cod_motorista is not null then
servico_escala_equipes.cod_motorista else 0 end,
   servico_escala_equipes.destinacao,
   servico_escala_equipes.tipo_recurso,
   servico_escala_plantao.dthinicio,
   servico_escala_plantao.dthfim,
   false,
   '03',
   false,
   false,
   false,
   0,
   0,
   servico_recursos_fisicos.id_nextel,
   false,
   false,
   false,
   servico_escala_plantao.dthinicio,
   servico_escala_plantao.dthinicio,
   servico_escala_plantao.dthinicio

where
   servico_escala_plantao.cod_plantao = servico_escala_equipes.cod_plantao and
   servico_recursos_fisicos.cod_rf = servico_escala_equipes.cod_rf and
   current_timestamp + interval '1 hour' >= servico_escala_plantao.dthinicio and
   servico_escala_equipes.fechado = false;

   -- fecha o registro da equipe que obedeceram a condicao anterior
   update servico_escala_equipes set fechado = true
   where
      fechado = false and
      servico_escala_plantao.cod_plantao =
servico_escala_equipes.cod_plantao and
      servico_recursos_fisicos.cod_rf = servico_escala_equipes.cod_rf and
      current_timestamp + interval '1 hour' >= servico_escala_plantao.dthinicio;

   -- fecha o plantao no seu termino anterior
   update servico_escala_plantao set fechado = true
   where
      fechado = false and
      current_timestamp >= servico_escala_plantao.dthfim;

   -- recursos com plantao finalizado e que se encontram em suas
respectivas bases e que nao estejam inoperantes, finalizar plantao
   update servico_recursos_operantes set status = '05', saida_medico =
current_timestamp, saida_auxiliar = current_timestamp, saida_motorista
= current_timestamp
   where
      status in('01','03') and current_timestamp >= dthtermino_plantao;

   -- recursos com cheklist concluido e que iniciarao o plantao neste
momento e que não estejam em recursos operantes com status diferente
de 03
   update servico_recursos_operantes set status = '01',
liberacao_recurso = current_timestamp
   where
      status = '03' and checado = true and current_timestamp >=
dthinicio_plantao and cod_rf not in(select cod_rf from
servico_recursos_operantes where status in('01','02', '04','05', '06',
'07'));


   -- este plantao termina nos proximos 15 minutos and status = '01'
   update servico_recursos_operantes set terminando_plantao = true
   where
      current_timestamp + interval '15 minutes'   >=
dthtermino_plantao and terminando_plantao = false;

   -- este plantao inicia nos proximos 15 minutos e ainda não fora checados
   update servico_recursos_operantes set iniciando_plantao = true
   where
      current_timestamp  + interval '15 minutes' >=  dthinicio_plantao
and status = '03' and checado = false and iniciando_plantao = false;

   -- despacha as remocoes agendadas para a s proximas hh:mm horas
   update servico set
      hpades = current_timestamp,
      hpaequ = null,
      usuario_dem1 = 'SISTEMA'
   where
      hpades is null and hagrem is not null and hagrem <
current_timestamp + empresa.limite_despacho_remocao;
END;

Muito obrigado,

--
Fernando França
Linux User #263682

2008/10/21 Euler Taveira de Oliveira <[EMAIL PROTECTED]>:
> Fernando França escreveu:
>
>> Um exemplo de consulta que já gera o tal erro é logo após o login no
>> meu sistema:
>>
> É essa consulta que aparece no log do postgresql juntamente com o erro
> de tid? Aparentemente esta consulta não manipula tids. Qual o EXPLAIN
> desta consulta?
>
> Sugiro que acrescente o 'FROM servico_recursos_utilizados' nos locais
> marcados abaixo. Depender do missing_from é horrível. Além disso sugiro
> que retire esse monte de 'casts' desnecessários que só estão
> atrapalhando o entendimento da consulta.
>
>> ###
>>
>> select cast(
>>         case when servico.cancelado then
>>           cast(' ' as char(8))
>>         else
>>
>>           case when servico.classif_servico = '04' or servico.cancelado then
>>                case when servico.hfiser is not null then
>>                   cast(to_char(age(servico.hfiser, servico.hinsol),
>>                     'HH24:MI:SS') as char(8))
>>                  else
>>                    cast(to_char(age(current_timestamp, servico.hinsol),
>>                     'HH24:MI:SS') as char(8))
>>              end
>>              -- Todas as unidades deste atendimento estao liberadas
>>
>>
>>              when servico.classif_servico = '01' then
>>              case when (select count(*) from servico_recursos_utilizados
>>                             where num_servico = servico.num_servico and 
>> hlimov is
>> null) > 0 or
>>                        (select count(*) from servico_recursos_utilizados
>>                             where num_servico = servico.num_servico) = 0 then
>>                    cast(to_char(
>>                                age(current_timestamp, servico.hinsol),
>>                     'HH24:MI:SS') as char(8))
>>
>>                   else
>>                    cast(to_char(
>>                                age((select servico_recursos_utilizados.hlimov
>                                      ^^^^^^^^^^^^^^^^^
>>                                      where 
>> servico_recursos_utilizados.num_servico =
>>       servico.num_servico
>>                                     order by 
>> servico_recursos_utilizados.ordem desc limit 1),
>>                                         servico.hinsol),
>>                          'HH24:MI:SS') as char(8))
>>
>>              end
>>
>>
>>              when servico.classif_servico = '02' then
>>              -- Todas as unidades desta remocao estao liberadas
>>                  case when (select count(*) from servico_recursos_utilizados
>                              ^^^^^^^^^^^^^^^^^^^^
>>                             where num_servico = servico.num_servico and 
>> hlimov is
>> null) = 0 then
>>                     (select
>>                     cast( to_char(sum(age(servico_recursos_utilizados.hlimov,
>>                                                       
>> servico_recursos_utilizados.hpaequ)),
>>                     'HH24:MI:SS') as char(8))
>                               ^^^^^^^^^^^^^^^^^^^^^^
>>                                 where 
>> servico_recursos_utilizados.num_servico =
>>                     servico.num_servico)
>>
>>
>>                   else
>>                                  cast(to_char(
>>                              age(current_timestamp,
>>                                  (select 
>> max(servico_recursos_utilizados.hpaequ)
>                                    ^^^^^^^^^^^^^^^^^^^^^^
>>                                  where num_servico = servico.num_servico)),
>>                                 'HH24:MI:SS') as char(8))
>>
>>               end
>>
>>               end
>>
>>         end
>>               as char(8))
>>
>>
>>               as total from servico where num_servico = NULL;
>>
>
>
> --
>  Euler Taveira de Oliveira
>  http://www.timbira.com/
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a