Presumo che tu stia facendo qualcosa del genere:
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;
In fase di compilazione la tabella, TEMP
, non esiste . Non è stato ancora creato. Poiché non esiste, non puoi selezionarlo; quindi devi anche fare il SELECT in modo dinamico. In realtà non è necessario eseguire una SELECT in questo particolare situazione, tuttavia puoi utilizzare il returning into
sintassi.
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;
Tuttavia, la necessità di creare tabelle dinamicamente è normalmente un'indicazione di uno schema mal progettato. Non dovrebbe essere davvero necessario.
Posso consigliare René Nyffenegger
post "Perché SQL dinamico non è valido?"
per motivi per cui dovresti evitare l'SQL dinamico, se possibile, dal punto di vista delle prestazioni. Tieni inoltre presente che sei molto più aperto a Iniezione SQL
e dovrebbe utilizzare variabili di collegamento e DBMS_ASSERT
per proteggersi da esso.