Jeg går ud fra, at du gør noget i stil med følgende:
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å kompileringstidspunktet tabellen, TEMP
, findes ikke . Den er ikke oprettet endnu. Da det ikke eksisterer, kan du ikke vælge fra det; du skal derfor også udføre SELECT dynamisk. Der er faktisk ikke behov for at foretage et SELECT i denne særlige situation selvom du kan bruge returning into
syntaks.
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;
At skulle oprette tabeller dynamisk er dog normalt en indikation af et dårligt designet skema. Det burde egentlig ikke være nødvendigt.
Jeg kan anbefale René Nyffenegger's
indlæg "Hvorfor er dynamisk SQL dårlig?"
af grunde til, hvorfor du bør undgå dynamisk SQL, hvis det overhovedet er muligt, ud fra et præstationssynspunkt. Vær også opmærksom på, at du er meget mere åben over for SQL-injektion
og skal bruge bindevariabler og DBMS_ASSERT
for at hjælpe med at beskytte sig mod det.