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