Saya berasumsi Anda melakukan sesuatu seperti berikut:
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;
Pada waktu kompilasi tabel, TEMP
, tidak ada . Itu belum dibuat. Karena tidak ada, Anda tidak dapat memilihnya; karena itu Anda juga harus melakukan SELECT secara dinamis. Sebenarnya tidak perlu melakukan SELECT dalam khusus ini situasi meskipun Anda dapat menggunakan returning into
sintaks.
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;
Namun, kebutuhan untuk membuat tabel secara dinamis biasanya merupakan indikasi skema yang dirancang dengan buruk. Seharusnya tidak perlu.
Saya dapat merekomendasikan René Nyffenegger's
posting "Mengapa SQL dinamis buruk?"
untuk alasan mengapa Anda harus menghindari SQL dinamis, jika memungkinkan, dari sudut pandang kinerja. Perlu diketahui juga bahwa Anda jauh lebih terbuka untuk Injeksi SQL
dan harus menggunakan variabel bind dan DBMS_ASSERT
untuk membantu menjaganya.