Em 05-02-2014 23:29, Fabrízio de Royes Mello escreveu:
On 05-02-2014 15:01, Daniel Cordeiro wrote:
Obrigado pela correção Euler. Na ânsia de explicar uma forma de executar
o que se tinha interesse escrevi sem nem pensar na reescrita feita pelo
planejador antes da execução. Serei mais cuidadoso nas próximas!
Acontece que minha realidade para a consulta que impulsionou a escolha
por uma procedure ao invés de uma visão é bem diferente da exposta no
início deste tópico. Minha consulta possui diversas subqueryes com
definições de parâmetros e cálculos que não puderam ser
solucionados/otimizados com uso de CTEs ou views (e se tornou
impraticável para o momento a reescrita do modelo de negócio do banco).
E não apenas encapsular uma única condição.
Claro, sempre existe uma forma melhor de se fazer, o limite neste
contexto esta no meu 'universo conhecido' ;-P.
Daniel,
Creio que vc compreendeu bem porque o pessoal lhe indicou simplesmente
criar uma VIEW e que a mesma sofre um processo de reescrita antes de
ser executada, e com isso obtemos performance.
Então se mesmo assim vc precisa de um "parametro" em sua view, creio
que podes usar as funções "set_config" e "current_setting" [1] para
criar uma variável de sessão (ou use a extensão session_variables [2]).
Exemplo:
CREATE VIEW v_foo AS SELECT * FROM foo WHERE codigo =
current_setting('foo.codigo')::INTEGER;
Para executar:
SELECT set_config('foo.codigo', '1', false);
SELECT * FROM v_foo;
Não sei se isso lhe ajudará, até porque não compreendi bem o seu
problema de usar uma VIEW sem isso, e também tem a questão que vc terá
se "setar" na sessão o valor do seu parâmetro...
Att,
[1] http://www.postgresql.org/docs/current/static/functions-admin.html
[2] http://pgxn.org/dist/session_variables/0.0.4/
Fabrizio, interessante sua dica, não conhecia esse recurso. Vou
pesquisar mais sobre ele.
Já sobre o meu problema eu tentei explicar melhor em um email antes desse.
O fato é que eu não quero ter que ficar passando clausula WHERE sempre
que eu chamar a VIEW. Quero poder chamar a VIEW apenas passando o nome
dela e o valor que será usado no filtro WHERE que está encapsulado
dentro dela, igualmente como se faz usando funções: select
nome_da_view(valor_a_ser_usado_no_where_da_view);
Mas essa sintaxe não é aceita pelas views, vou pesquisar melhor sua dica
e ver se ela resolve.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral