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
