Jota

Obrigado pela resposta mas o intúito era saber internamente da função, pois no 
caso da função utilizada no exemplo ela pode sim ser chamada sem informar 
parametro.




________________________________
De: JotaComm <[email protected]>
Para: Comunidade PostgreSQL Brasileira <[email protected]>
Enviadas: Quinta-feira, 15 de Julho de 2010 10:20:18
Assunto: Re: [pgbr-geral] Função Dinâmica, qual melhor forma de criar?

Olá,



Em 15 de julho de 2010 10:00, Angelo - Web Studio Brasil 
<[email protected]> escreveu:

Amigos, bom dia,
>
>Estou em um impasse querendo saber dos mais experientes qual a melhor forma de 
>criar funções dinâmicas no PostgreSQL.
>

Eu trabalharia com outra questão.

Na definição da função definir a função como: RETURNS NULL ON NULL INPUT, assim 
sendo a função retorna diretamente NULL se algum dos parâmetros for NULL.


>Qual dos 2 cenários abaixo é o melhor em termos de performance, lembrando que 
>esta consulta é simples, mas o intuito da pergunta é para funções mais 
>complexas 
>que analisam tabela com grandes quantidades de registros fazendo joins entre 
>elas:
>
>1 - Cenário:
>Criar a consulta com vários JOINS e fazer um IF na função colocando os 
>respectivos WHERE de acordo com os parametros passados:
>Ex: 
>CREATE OR REPLACE FUNCTION public.f_teste( p_id integer, p_uf character 
>varying 
>)
>  RETURNS SETOF public.f_teste AS
>$BODY$
>DECLARE
>    var_row         public.f_teste%ROWTYPE;
>    var_record    RECORD;
>    var_strSQL    VARCHAR;
>BEGIN
>    var_strSQL :=    '
>                    SELECT    
>                        cliente.id,
>                        cliente.nome
>                    FROM cliente
>                    join uf on uf.id = cliente.uf_id
>                    WHERE 1 = 1
>                     ';
>    IF (p_id IS NOT NULL) THEN
>        var_strSQL := var_strSQL || ' AND cliente.id = ' || p_id;
>    END IF;
>    
>    IF (p_uf IS NOT NULL) THEN
>        var_strSQL := var_strSQL || ' AND uf.sigla = ''' || p_uf || '''';
>    END IF;
>    
>    FOR var_record IN
>        EXECUTE var_strSQL
>    LOOP
>        var_row.id := var_record.id;
>        var_row.cliente_nome := var_record.nome;
>        RETURN NEXT var_row;
>    END LOOP;
>    
>    RETURN;
>END;
>$BODY$
>  LANGUAGE  'plpgsql' VOLATILE SECURITY DEFINER;
>
>
>2 - Cenário:
>Criar a consulta com vários IF's colocando  os respectivos JOIN e WHEREs de 
>acordo com os parametros passados:
>Ex: 
>CREATE OR REPLACE FUNCTION public.f_teste( p_id integer, p_uf character  
>varying 
>)
>  RETURNS SETOF public.f_teste AS
>$BODY$
>DECLARE
>    var_row        public.f_teste%ROWTYPE;
>    var_record    RECORD;
>    var_join        VARCHAR;
>    var_where     VARCHAR;
>    var_strSQL    VARCHAR;
>BEGIN
>
>    IF (p_id IS NOT NULL) THEN
>        var_where := var_where || ' AND cliente.id = ' || p_id;
>    END IF;
>    
>    IF (p_uf IS NOT NULL) THEN
>        var_join := var_join || ' join uf on uf.id = cliente.uf_id ';
>        var_where := var_where || ' AND uf.sigla = ''' || p_uf ||  '''';
>    END IF;
>
>    var_strSQL :=  '
>                    SELECT    
>                        cliente.id,
>                        cliente.nome
>                    FROM cliente
>                   '  || var_join || '
>                    WHERE 1 = 1
>                    ' || var_where;
>  
>    FOR var_record IN
>        EXECUTE var_strSQL
>    LOOP
>        var_row.id := var_record.id;
>        var_row.cliente_nome := var_record.nome;
>        RETURN NEXT var_row;
>    END LOOP;
>    
>    RETURN;
>END;
>$BODY$
>  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
>
> 
>_______________________________________________
>pgbr-geral mailing list
>[email protected]
>https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

[]s
-- 
JotaComm
http://jotacomm.wordpress.com



      
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a