Bom dia,

Em 05-02-2014 11:02, Rafael Fialho Corrêa escreveu:
Em 5 de fevereiro de 2014 11:55, Matheus Saraiva <matheus.sara...@gmail.com <mailto:matheus.sara...@gmail.com>> escreveu:


    Rafael Fialho

    Não entendi o que vc quis dizer, o que preciso é que a clausula
    WHERE receba um parâmetro. Como:

    V = 'matheus'

    WHERE nome = V

    A variável V receberia o seu valor por parâmetro.


O que quero dizer é o seguinte:

CREATE OR REPLACE VIEW teste AS
  select
    id_nome
    , nome
  from
    nomes;
GRANT ALL ON TABLE teste TO public;

"select * from teste where nome = 'matheus';"

Simples assim.. hehehe Isso que eu quis dizer.
Acredito que esta não seja uma opção tão 'performática', uma vez que a view vai gerar todos os dados e só depois é que o planejador realizará a restrição através do cláusula WHERE e ordenações necessárias.

Minha sugestão é criar uma função que realiza a consulta já adicionando as restrições necessárias para a triagem inicial dos dados desejados.

Ex (descartando índices, segurança da função, etc)*1*.

   /CREATE TABLE lancamentos (id int, conta text, campo1 text, campo2
   text);//
   //
   //INSERT INTO lancamentos VALUES(1,'Produtivo','valor1','valor2');//
   //INSERT INTO lancamentos VALUES(2,'Produtivo','valor1','valor2');//
   //INSERT INTO lancamentos VALUES(3,'Mecanica','valor1','valor2');//
   //INSERT INTO lancamentos VALUES(4,'Mecanica','valor1','valor2');//
   ....
   //
   //CREATE OR REPLACE FUNCTION sp_lancamentos(IN CODCONTA varchar)
   RETURNS TABLE(i int, c1 text,c2 text, c text)//
   //AS $$//
   //
   //    BEGIN//
   //        RETURN QUERY SELECT id,conta,campo1,campo2 FROM
   lancamentos WHERE conta = CODCONTA;//
   //    END;//
   //$$//
   //language 'plpgsql';/


Para uma function muito grande e com muitas variáveis para substituição, vale a pena utilizar a cláusula EXECUTE no RETURN QUERY (isso já me salvou de vários problemas em functions com mais mais de 1500 linhas e código e dezenas de variáveis)*2*:
/
    ....
RETURN QUERY EXECUTE 'SELECT id,conta,campo1,campo2 FROM lancamentos WHERE conta = $1' USING CODCONTA;//
/    ....


Lembrando que estas ações podem dificultar a análise de um problema futuro, pois o EXPLAIN não vai detalhar o conteúdo interno executado na função e nem nos logs.

*1* - http://www.postgresql.org/docs/9.3/static/plpgsql-declarations.html
*2* - http://www.postgresql.org/docs/9.3/static/plpgsql-statements.html


Espero ter ajudado.


--
+--------------------------------------------------------------------------+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--------------------------------------------------------------------------+

_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a