Ik neem aan dat je zoiets als het volgende doet:
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;
Tijdens het compileren is de tabel TEMP
, bestaat niet . Het is nog niet aangemaakt. Omdat het niet bestaat, kun je er niet uit selecteren; je moet de SELECT dus ook dynamisch doen. Het is eigenlijk niet nodig om een SELECT te doen in deze bepaalde situatie kunt u echter de returning into
syntaxis.
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;
Het dynamisch maken van tabellen is echter normaal gesproken een indicatie van een slecht ontworpen schema. Het zou niet echt nodig moeten zijn.
Ik kan René Nyffenegger's
aanbevelen post "Waarom is dynamische SQL slecht?"
om redenen waarom u dynamische SQL moet vermijden, indien mogelijk, vanuit het oogpunt van prestaties. Houd er ook rekening mee dat u veel meer openstaat voor SQL-injectie
en moet bindvariabelen gebruiken en DBMS_ASSERT
om je ertegen te beschermen.