On 28-02-2014 21:19, Carlos Antônio Pereira (VidaUTI) wrote:
 >Carlos,
 >Estou chegando um pouco tarde a essa discussão, mas resumindo o que vc
precisa seria
 >uma função com um retorno *variável*, ou seja, com diferentes tipos de
dados e valores??
Boa noite, Fabrizio.
Sim.
O sistema ora desenvolvido sera utilizado na web, com conexão 3G, em
tablets que serão colocados
nas ambulâncias. De acordo com este cenário me preocupou usar recursos
desnecessários, como por
exemplo, fazer junções LEFT JOIN, conforme script mais abaixo.
Assim, o objetivo da função, seria basicamente pegar somente os
atributos das tabelas pertinentes
,
dependendo da classificação do servico, e retorná-los à aplicação.
Se o serviço for APH (Atendimento Pré-Hospitalar), as entidades
participantes do relacionamento são:
Serviço,
Sintomatologia,
Orientação
Se o servico form REM (Remoção), o relacionamento seria:
Serviço,
Agenda de Remoções
Quadro Clínico,
Observações da Remoção


<corte>

A tela inicial do aplicativo é esta:
www.utivida.com.br/mapa_despacho.jpg
<http://www.utivida.com.br/mapa_despacho.jpg>
Depois que o usuário chega a esta tela, uma das funcionalidades é
detalhar determinado serviço, conforme tela abaixo:
www.utivida.com.br/servico_detalhes.jpg
<http://www.utivida.com.br/servico_detalhes.jpg>

Bacana!


Ao clicar no botão Detalhes de Serviço, submete-se um script que retorna
um objeto JSon da consulta abaixo:
$sql = "SELECT * from view_get_servico WHERE num_servico = ";
$sql .= $_GET['num_servico'];
Justificativa:
Depois de análise de algumas estastísticas, percebi que o fluxo de
serviços da empresa é 50% de Remoções.
Então, executar o script acima nesta ferramenta, vai consumir recursos
desnecessariamente, em muitos momentos,
já que quando tratar-se de uma remoção, grande parte da consulta terá
apenas estrutura e valores nulos circulando na
web.
Então, pensei numa função que pudesse avaliar um campo (classif_serviço)
e dependendo dessa avaliação, me devolver
um ou outro resultado. Seria baseada em RECORD, mais ou menos assim:
Selecionar dados do serviço; (Comum em ambas as consultas)
Se classif_servico = ‘APH’,  então
{
  Selecionar dados da Sintomatologia;
  Selecionar dados da Orientação;
  Montar resultado;
}
Senão
{
  Selecionar dados da Agenda de Remoções;
  Selecionar dados do Quadro Clínico;
  Selecionar dados de Observação;
  Montar Resultado;
}

Vc não tem como determinar isso na sua aplicação?? Pq se tiver vc poderia criar 2 (duas) views diferentes para cada tipo e fazer uso do INNER JOIN ao invés do LEFT JOIN, se possível claro. E dai no seu código PHP montar a sua string com o SELECT de acordo com a "classif_servico", da mesma forma que vc demonstrou acima naquele pseudo-código.

E se vc estiver utilizando a 9.3 pode se beneficiar das Visões Materializadas [1]. Até mesmo em versões mais antigas tem como *emular* esse comportamento [2] para obter melhor performance, mas as visões por si só são bem performáticas se vc tiver índices e junções adequados.


Retornar Resultado;
Então, um dos membros da lista me passou um exemplo usando matrizes que
acredito que vai funcionar.


É uma solução também, mas reveja bem tudo isso para determinar se realmente será necessário criar uma SRF para implementar isso.

Att,


[1] http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html
[2] http://www.varlena.com/GeneralBits/Tidbits/matviews.html

--
   Fabrízio de Royes Mello         Timbira - http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a