Ir para conteúdo

POWERED BY:

Arquivado

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

Douglas Tondo

Execute Immediate

Recommended Posts

Mais uma vez venho pedir a ajuda do pessoal aqui do fórum..

 

a duvida parece simples, acho que o erro deve estar na sintaxe..

 

executo o comando azul com o comando 'EXECUTE IMMEDIATE'

mas preciso do resultado da variável 'v_DS_FILTRO' que está dentro da string a ser executata...

 

li em alguns lugares que colocando 'EXECUTE IMMEDIATE v_stmt into VARIAVEL DE AMBIENTE' ou

'EXECUTE IMMEDIATE v_stmt using out VARIAVEL DE AMBIENTE'

funcionaria, mas não foi... quando coloco "into" dá o erro: 'A variável não está na lista de seleções'..

 

alguma idéia????

 

-------------------------------------------------------------------------------------------------------

v_stmt:= '

 

DECLARE

v_CD_GRUPO_TEMP NUMBER(10,0);

v_DS_FILTRO VARCHAR2(500);

CURSOR grupo_cursor IS

SELECT CD_MT_GRUPO

FROM MT_GRUPO

WHERE FL_ATIVO=1 '|| v_DS_FILTRO_TEMP ||' ;

 

BEGIN

OPEN grupo_cursor;

LOOP

FETCH grupo_cursor INTO V_CD_GRUPO_TEMP;

IF length(v_DS_FILTRO) > 0 then

v_DS_FILTRO := v_DS_FILTRO || '' '';

end if;

v_DS_FILTRO := v_DS_FILTRO || To_Char(v_CD_GRUPO_TEMP);

EXIT WHEN grupo_cursor%NOTFOUND;

END LOOP;

-- raise_application_error( -20002, v_DS_FILTRO);

END;

';

 

execute immediate v_stmt;

-------------------------------------------------------------------------------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andei dando umas lidas em alguns sites: pesquisa 1, e vi que o erro está no fato de a variavel do comando: "execute immediate v_stmt into VARIAVEL"; não está sendo retornada por um select e sim por um cursor...

 

tentei adicionar a linha:

 

"select v_DS_FILTRO into temp (que eu teria declarado) from dual "

 

entao tentei: "execute immediate v_stmt into TEMP"... mas mesmo assim continua dando o mesmo erro... alguém tem alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o erro que está sendo gerado para ser preciso?

 

Pois pode ser problemas na declaração da variável, no retorno da instrução e etc....

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o erro que está sendo gerado para ser preciso?

 

Pois pode ser problemas na declaração da variável, no retorno da instrução e etc....

 

Abraços,

Caro alphamek,

 

quando se executada aquela string com esse comando: "EXECUTE IMMEDIATE v_stmt into VARIAVEL_DE_AMBIENTE"

 

dá um erro: 'A variável não está na lista de seleções'

 

tu disse que talves poderia ser problema na declaração da variável. Onde mais especificamente devo declará-la? Fora ou dentro da string, ou dentro e fora?

 

fiz dentro e fora... mas mesmo assim não tá indo.. tem alguma dica relacionada? talves eu tenha feito de forma errada.

 

obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahhhh aleluia finalmente consegui.... o era um problema sinistro de sintaxe

 

O link do Motta me ajudou a conseguir resolver o problema, depois de esfriar a cabeça e ficar algum tempo sem olhar o código. Vlw Motta!!!

 

Dentro da string "v_stmt" (Topo do post) era só colocar : "1: (variável a qual quero retornar o resultado dentro da string de execução)".

 

O comando execute immediate fica:

 

"execute immediate v_stmt USING OUT v_DS_FILTRO_TEMP(sendo essa variável uma qualquer para receber o resultado);"

 

o código final fica assim:

 

********************************************************************************

******************

v_stmt:= '

 

DECLARE

v_CD_GRUPO_TEMP NUMBER(10,0);

v_DS_FILTRO VARCHAR2(500);

CURSOR grupo_cursor IS

SELECT CD_MT_GRUPO

FROM MT_GRUPO

WHERE FL_ATIVO=1 '|| v_DS_FILTRO_TEMP ||' ;

 

BEGIN

OPEN grupo_cursor;

LOOP

FETCH grupo_cursor INTO V_CD_GRUPO_TEMP;

IF length(v_DS_FILTRO) > 0 then

v_DS_FILTRO := v_DS_FILTRO || '' '';

end if;

v_DS_FILTRO := v_DS_FILTRO || To_Char(v_CD_GRUPO_TEMP);

EXIT WHEN grupo_cursor%NOTFOUND;

END LOOP;

:1 := v_DS_FILTRO;

END;

';

v_DS_FILTRO_TEMP:='';

execute immediate v_stmt USING OUT v_DS_FILTRO_TEMP;

 

raise_application_error(-20005,v_DS_FILTRO_TEMP ); -- só para ver o resultado

********************************************************************************

******************

 

obrigado a todos que colaboraram nesse post. A ajuda de voces foi fundamental para a essa solução. Obrigado!

 

Se alguem tiver alguma duvida do tipo posta ai tb!

Compartilhar este post


Link para o post
Compartilhar em outros sites

È sempre bom postar a solução ou se funcionou pois pode ajudar alguém no futuro.

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.