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