Ir para conteúdo
Fórum CódigoFonte.net
Entre para seguir isso  
Tiago Maia

Converter variável VARCHAR em uma QUERY

Recommended Posts

Pessoal, boa tarde!

Sou novo aqui! :D

Tenho uma dúvida!

Como converter uma variável VARCHAR em uma QUERY em plpgsql?

Tenho uma FUNÇÃO e nela eu preciso executar um FOR que usa uma query.

DECLARE

resultado RECORD;

v_sql VARCHAR = '';

BEGIN

v_sql := 'SELECT * FROM tab_orcamentoAnual';

FOR resultado IN v_sqlLOOP

id := resultado.id;

estado := resultado.estado;

diretoria := resultado.diretoria;

ano := resultado.ano;

RETURN NEXT;

END LOOP;

END;

Dentro do FOR no lugar da variável v_sql deve ser inserido uma QUERY, mas eu preciso montar esta QUERY dinamicamente, e eu faço isso através de uma VARCHAR. Só que, ao informar a variável VARCHAR no FOR, ele da o seguinte erro:

ERROR: syntax error at or near "$1"

LINE 1: $1

^

QUERY: $1

CONTEXT: SQL statement in PL/PgSQL function "func_consultar_orcamentoanual" near line 81

Tem como alguém me ajudar?

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pessoal, boa tarde!

Sou novo aqui! :D

Tenho uma dúvida!

Como converter uma variável VARCHAR em uma QUERY em plpgsql?

Tenho uma FUNÇÃO e nela eu preciso executar um FOR que usa uma query.

DECLARE

resultado RECORD;

v_sql VARCHAR = '';

BEGIN

v_sql := 'SELECT * FROM tab_orcamentoAnual';

FOR resultado IN v_sqlLOOP

id := resultado.id;

estado := resultado.estado;

diretoria := resultado.diretoria;

ano := resultado.ano;

RETURN NEXT;

END LOOP;

END;

Dentro do FOR no lugar da variável v_sql deve ser inserido uma QUERY, mas eu preciso montar esta QUERY dinamicamente, e eu faço isso através de uma VARCHAR. Só que, ao informar a variável VARCHAR no FOR, ele da o seguinte erro:

ERROR: syntax error at or near "$1"

LINE 1: $1

^

QUERY: $1

CONTEXT: SQL statement in PL/PgSQL function "func_consultar_orcamentoanual" near line 81

Tem como alguém me ajudar?

Obrigado!

SOLUCIONADO!!!

Foi só colocar a palavra reservada EXECUTE depois do IN no FOR.

O FOR ficou assim:

FOR resultado IN EXECUTE v_sql LOOP

id := resultado.id;

estado := resultado.estado;

diretoria := resultado.diretoria;

ano := resultado.ano;

RETURN NEXT;

END LOOP;

Quando a query é informada direto no LOOP, não precisa do EXECUTE, mas quando ela esta em uma variável VARCHAR, é necessário colocar o EXECUTE.

Aqui esta a função completa que monta uma query dinâmica:

CREATE OR REPLACE FUNCTION func_consultar_orcamentoanual(IN p_id INTEGER,

IN p_estado VARCHAR,

IN p_diretoria VARCHAR,

IN p_ano INTEGER,

OUT id INTEGER,

OUT estado VARCHAR,

OUT diretoria VARCHAR,

OUT ano INTEGER) RETURNS SETOF record AS

$$

DECLARE

v_cont INTEGER = 0;

v_totalParametros INTEGER = 0;

v_sql VARCHAR = '';

v_condicao VARCHAR = '';

resultado RECORD;

BEGIN

----- Preenche as Variáveis e conta os parâmetros -----

IF p_id IS NOT NULL THEN

v_totalParametros := v_totalParametros + 1;

END IF;

IF p_estado IS NOT NULL THEN

v_totalParametros := v_totalParametros + 1;

END IF;

IF p_diretoria IS NOT NULL THEN

v_totalParametros := v_totalParametros + 1;

END IF;

IF p_ano IS NOT NULL THEN

v_totalParametros := v_totalParametros + 1;

END IF;

----- Monta o WHERE da QUERY -----

WHILE v_cont < v_totalParametros LOOP

IF v_cont > 1 THEN

v_condicao := v_condicao || ' AND ';

END IF;

IF p_id IS NOT NULL THEN

v_condicao := v_condicao || 'id = ' || p_id;

v_cont := v_cont + 1;

IF v_cont < v_totalParametros THEN

v_condicao := v_condicao || ' AND ';

END IF;

END IF;

IF p_estado IS NOT NULL THEN

v_condicao := v_condicao || 'estado = ' || '\'' || p_estado || '\'';

v_cont := v_cont + 1;

IF v_cont < v_totalParametros THEN

v_condicao := v_condicao || ' AND ';

END IF;

END IF;

IF p_diretoria IS NOT NULL THEN

v_condicao := v_condicao || 'diretoria = ' || '\'' || p_diretoria || '\'';

v_cont := v_cont + 1;

IF v_cont < v_totalParametros THEN

v_condicao := v_condicao || ' AND ';

END IF;

END IF;

IF p_ano IS NOT NULL THEN

v_condicao := v_condicao || 'ano = ' || p_ano;

v_cont := v_cont + 1;

IF v_cont < v_totalParametros THEN

v_condicao := v_condicao || ' AND ';

END IF;

END IF;

END LOOP;

----- Inicia a QUERY -----

v_sql := 'SELECT * FROM tab_orcamentoAnual';

----- Tendo UM ou mais parâmetros, insere a cláusula WHERE na QUERY -----

IF v_totalParametros > 0 THEN

v_sql := v_sql || ' WHERE ';

END IF;

----- Finaliza a QUERY -----

v_sql := v_sql || v_condicao;

----- Executa a QUERY -----

FOR resultado IN SELECT * FROM tab_orcamentoAnual LOOP

id := resultado.id;

estado := resultado.estado;

diretoria := resultado.diretoria;

ano := resultado.ano;

RETURN NEXT;

END LOOP;

END;

$$ LANGUAGE 'plpgsql';

Facinho né?!

Abraço a todos e até a próxima!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi mal gente!

Esqueci de corrigir o FOR da função completa. É assim que deve ficar:

----- Executa a QUERY -----

FOR resultado IN EXECUTE v_sql LOOP

id := resultado.id;

estado := resultado.estado;

diretoria := resultado.diretoria;

ano := resultado.ano;

RETURN NEXT;

END LOOP;

Vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Visitante
Responder

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Processando...
Entre para seguir isso  

×
×
  • Criar Novo...