Suponho que você esteja fazendo algo como o seguinte:
declare
v_temp varchar2(20);
begin
execute immediate 'create table temp(name varchar(20))';
execute immediate 'insert into temp values(''XYZ'')';
select name into v_name from temp;
end;
Em tempo de compilação a tabela,
TEMP
, não existe . Ainda não foi criado. Como ela não existe, você não pode selecionar a partir dela; você, portanto, também tem que fazer o SELECT dinamicamente. Na verdade, não há necessidade de fazer um SELECT neste particular embora você possa usar o returning into
sintaxe. declare
v_temp varchar2(20)
begin
execute immediate 'create table temp(name varchar2(20))';
execute immediate 'insert into temp
values(''XYZ'')
returning name into :1'
returning into v_temp;
end;
No entanto, a necessidade de criar tabelas dinamicamente normalmente é uma indicação de um esquema mal projetado. Não deveria ser realmente necessário.
Posso recomendar René Nyffenegger's post "Por que o SQL dinâmico é ruim?" por razões pelas quais você deve evitar o SQL dinâmico, se possível, do ponto de vista do desempenho. Esteja ciente de que você está muito mais aberto a Injeção de SQL e deve usar variáveis de ligação e
DBMS_ASSERT
para ajudar a protegê-lo.