Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lujac

Montar o Select em uma Procedure do Postgre

Recommended Posts

Fala Galera!

 

Alguém pode me ajudar ou então mandar um exemplo de código de procedure no postgre onde acontece o seguinte: tem um formulário em php que é filtro, ou seja o usuário seleciona ou digita as informações que quer pesquisar. Quando ele clica no botão Localizar dispara uma procedure (function) que faz a busca dos dados de acordo com o filtro que ele selecionou.

 

Já trabalhei com SQL algum tempo e quando tinha uma situação dessa eu montava o SELECT numa variável e depois executava com o sp_executesql.

 

Alguém pode me ajudar a fazer isso no Postgre??

 

Tentei montar o SELECT igual fazia no SQL, salvando na variável e depois de montado coloquei:

 

EXECUTE sql;

 

Mas não tá dando certo......

 

Aqui vai o código se facilicitar:

 

CREATE OR REPLACE FUNCTION usp_get_cliente_filtro(integer, timestamp, character varying, character varying, character varying, character varying)

RETURNS SETOF tb_cad_cliente AS

 

$BODY$

 

DECLARE

 

sql text;

 

BEGIN

 

IF $1 != '' THEN

sql=' cod_cliente=' || $1;

END IF;

 

IF $2 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' dat_atualizacao=' || $2;

 

END IF;

 

IF $3 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' nom_cliente=' || $3;

 

END IF;

 

IF $4 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' nom_contato=' || $4;

 

END IF;

 

IF $5 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' num_cpf=' || $5;

 

END IF;

 

IF $6 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' num_cnpj=' || $6;

 

END IF;

 

sql=' SELECT

*

FROM

tb_cad_cliente

WHERE ' || sql;

 

 

EXECUTE sql;

 

END;

 

$BODY$

 

LANGUAGE 'plpgsql' VOLATILE;

 

Valeuuuu......

Compartilhar este post


Link para o post
Compartilhar em outros sites

lujac,

 

lembre que uma varíável de um stored procedure pode vim vazia ( '' ) ou simplesmente nula.

 

Dessa forma, no seu primeiro if deveria ficar assim:

 

IF coalesce($1, '') != '' THEN

sql=' cod_cliente=' || $1;

END IF;

 

O coalesce é "tipo" um if onde , se $1 for nulo, coloca o que valor default que você definiu em seguida (no caso acima, '').

 

 

Ainda, na linha

 

IF $2 != '' THEN
  IF sql != '' then sql=sql || ' and '
	sql=sql || ' dat_atualizacao=' || $2;
END IF;

Não encontrei o fechamento do segundo if. E , da mesma forma, a variável sql é nula por default, já que você não definiu um valor na sua declaração.

 

Dessa forma, deveria ficar.

 

 

IF coalesce($2, '') != '' THEN
  IF coalesce(sql, '') != '' then
	  sql := sql || ' and ';
  end if;

  sql := sql || ' dat_atualizacao=' || $2;
END IF;

Caso não usar coalesce na variável sql por todo o script, basta na declaração fazer:

 

sql text := '';

 

 

Ainda, vale lembrar que, caso você tenha uma string como parâmetro da sp, e você concatene o seu valor no sql, você precisar adicionar ' para que suaconsulta funcione corretamente, só que com escape na hora da concatenação.

 

O que eu recomendo é que, antes de você dar o execute do sql faça:

 

Raise notice 'sql statement: %', sql;

 

Dessa forma, vai logar como seu statement foi montado na variável sql e você poderá rodar no próprio pgadmin a query e corrigir seu script.

 

Fala Galera!

 

Alguém pode me ajudar ou então mandar um exemplo de código de procedure no postgre onde acontece o seguinte: tem um formulário em php que é filtro, ou seja o usuário seleciona ou digita as informações que quer pesquisar. Quando ele clica no botão Localizar dispara uma procedure (function) que faz a busca dos dados de acordo com o filtro que ele selecionou.

 

Já trabalhei com SQL algum tempo e quando tinha uma situação dessa eu montava o SELECT numa variável e depois executava com o sp_executesql.

 

Alguém pode me ajudar a fazer isso no Postgre??

 

Tentei montar o SELECT igual fazia no SQL, salvando na variável e depois de montado coloquei:

 

EXECUTE sql;

 

Mas não tá dando certo......

 

Aqui vai o código se facilicitar:

 

CREATE OR REPLACE FUNCTION usp_get_cliente_filtro(integer, timestamp, character varying, character varying, character varying, character varying)

RETURNS SETOF tb_cad_cliente AS

 

$BODY$

 

DECLARE

 

sql text;

 

BEGIN

 

IF $1 != '' THEN

sql=' cod_cliente=' || $1;

END IF;

 

IF $2 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' dat_atualizacao=' || $2;

 

END IF;

 

IF $3 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' nom_cliente=' || $3;

 

END IF;

 

IF $4 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' nom_contato=' || $4;

 

END IF;

 

IF $5 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' num_cpf=' || $5;

 

END IF;

 

IF $6 != '' THEN

IF sql != '' then sql=sql || ' and '

sql=sql || ' num_cnpj=' || $6;

 

END IF;

 

sql=' SELECT

*

FROM

tb_cad_cliente

WHERE ' || sql;

 

 

EXECUTE sql;

 

END;

 

$BODY$

 

LANGUAGE 'plpgsql' VOLATILE;

 

Valeuuuu......

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.