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
