Amigos, bom dia,

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

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

Responder a