Jag antar att du gör något i stil med följande:
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;
Vid kompileringstidtabellen, TEMP
, finns inte . Den har inte skapats ännu. Eftersom det inte finns kan du inte välja från det; du måste därför också göra SELECT dynamiskt. Det finns faktiskt inget behov av att göra en SELECT i detta speciellt situation men du kan använda returning into
syntax.
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;
Men att behöva skapa tabeller dynamiskt är normalt en indikation på ett dåligt utformat schema. Det borde egentligen inte vara nödvändigt.
Jag kan rekommendera René Nyffenegger's
inlägg "Varför är dynamisk SQL dålig?"
av anledningar till varför du bör undvika dynamisk SQL, om det alls är möjligt, ur prestandasynpunkt. Tänk också på att du är mycket mer öppen för SQL-injektion
och bör använda bindningsvariabler och DBMS_ASSERT
för att skydda sig mot det.