- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 12 anos atrás por dcarvalho.
-
AutorPosts
-
29 de outubro de 2012 às 8:45 pm #104714airoospParticipante
Boa tarde,
Alguém sabe se é possível substituir o conteúdo de uma variável em uma procedure conforme o valor passado no parâmetro.
Por exemplo:
create procedure pesquisa_conta
(
pEmpresa in varchar2
,pNumero out varchar2
)
isv_numero_conta varchar2(10);
begin
if pEmpresa = 20 then
select nr_conta into v_numero_conta
from cliente_20;elsif pEmpresa = 60 then
select nr_conta into v_numero_conta
from cliente_60;end if;
pNumero:=v_numero_conta;
end;
O que eu quero fazer é usar uma variável para passar o nome da tabela e utilizar apenas um select.
.
.
.
v_nome_tabela varchar2(10);begin
if pEmpresa = 20 then
v_nome_tabela:= ‘cliente_20’;
else
v_nome_tabela:= ‘cliente_60’;
end if;select nr_conta into v_numero_conta
from v_nome_tabela;pNumero:=v_numero_conta;
end;
Tentei fazer alguma coisa usando &v_nome_tabela ao invés do “execute immediate” mas não funcionou, ocorreu um erro na hora de compilar.
Se alguém tiver alguma dica, agradeço.
Obrigado.
Airton
29 de outubro de 2012 às 9:01 pm #104715rmanParticipante@airoosp
Segue a solução utilizando EXECUTE IMMEDIATE:
create procedure pesquisa_conta
(
pEmpresa in varchar2
,pNumero out varchar2
)
is
v_numero_conta varchar2(10);
v_nome_tabela varchar2(30);
beginif pEmpresa = 20 then
v_nome_tabela:= 'cliente_20';
else
v_nome_tabela:= 'cliente_60';
end if;EXECUTE IMMEDIATE 'select nr_conta from '||v_nome_tabela INTO v_numero_conta;
pNumero := v_numero_conta;
end;
29 de outubro de 2012 às 9:17 pm #104716airoospParticipanteEntendi a solução, mas sem o execute immediate não é possível fazer, correto?
A ideia seria utilizar macro substituição.
Airton
29 de outubro de 2012 às 9:44 pm #104717rmanParticipante@airoosp
Macro substituição não seria uma funcionalidade do sqlplus?
29 de outubro de 2012 às 10:43 pm #104718airoospParticipanteEntão, isso que eu gostaria de saber se a macro substituição pode ser usada ou não.
Airton
30 de outubro de 2012 às 1:56 am #104719dcarvalhoParticipanteOi Airton,
Você pode utilizar refcursor como no exemplo que criei abaixo:
[i]DECLARE
—
cur_obj SYS_REFCURSOR;
v_obj_name dba_objects.object_name%TYPE;
v_table VARCHAR2(40) := ‘dba_objects’;
v_obj_id Dba_Objects.object_id%TYPE := 54158;
—
BEGIN
—
OPEN cur_obj FOR ‘select object_name from ‘||v_table||’ where object_id = :b1′ USING v_obj_id;
LOOP
—
FETCH cur_obj INTO v_obj_name;
EXIT WHEN cur_obj%NOTFOUND;
—
DBMS_OUTPUT.PUT_LINE(v_obj_name);
—
END LOOP;
CLOSE cur_obj;
—
END;
/[/i]Caso opte pelo execute immediate, não esqueça de usar o USING para bind variable =)
Abraço,
Danilo Carvalho
https://www.profissionaloracle.com.br/blogs/dcarvalho -
AutorPosts
- Você deve fazer login para responder a este tópico.