Předpokládám, že děláte něco jako následující:
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;
Při kompilaci tabulky TEMP
, neexistuje . Ještě to nebylo vytvořeno. Protože neexistuje, nemůžete si z něj vybrat; proto také musíte provést SELECT dynamicky. V tomto konkrétním vlastně není potřeba provádět SELECT situace, i když můžete použít returning into
syntaxe.
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;
Potřeba dynamicky vytvářet tabulky je však obvykle známkou špatně navrženého schématu. Nemělo by to být opravdu nutné.
Mohu doporučit René Nyffenegger's
příspěvek "Proč je dynamické SQL špatné?"
z důvodů, proč byste se měli dynamickému SQL vyhnout, pokud je to možné, z hlediska výkonu. Uvědomte si také, že jste mnohem otevřenější vůči SQL injection
a měl by používat proměnné vazby a DBMS_ASSERT
pomoci se proti tomu bránit.