Anda tidak dapat menggunakan titik koma di EXECUTE IMMEDIATE
untuk pernyataan tunggal
Berikut kutipan dari dokumentasi :
Hapus titik koma dari EXECUTE IMMEDIATE
.
execute immediate 'create table smap1(nam varchar2(10));'; -- this is your code
execute immediate 'create table smap1(nam varchar2(10))'; -- correct code, no semicolon at end
Tapi ada masalah lain.
Anda perlu memahami bagaimana variabel substitusi (&variable
) berfungsi
SQL*Plus akan meminta variabel substitusi hanya sekali:tepat sebelum skrip dikompilasi, sebelum menjalankannya. Dan kemudian variabel diganti dalam skrip kata demi kata, setelah itu akan dikompilasi dan dieksekusi.
Misalnya, saat Anda menjalankan skrip, SQL*Plus mengenali bahwa ada dua literal yang tidak diketahui (&colname
dan &coldata
), dan akan meminta Anda. Jika Anda memberikan nilai 'age', dan 'number' untuk nilai tersebut, SQL*Plus akan menulis ulang skrip seperti ini:
declare
-- omitted to add clarity
begin
execute immediate 'create table smap1(nam varchar2(10));';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=number;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
Jadi jika Anda ingin menetapkan string literal ke variabel, dan Anda ingin mendapatkan string itu dari variabel substitusi, Anda perlu melakukan ini:
colname varchar2(30) := '&colname'; -- notice the single quotes
Dengan asumsi Anda memberikan 'usia' untuk colname
SQL*Plus akan dengan senang hati mengonversi ini menjadi:
colname varchar2(30) := 'age';
Jadi, menempatkan variabel substitusi di dalam loop tidak akan membuat SQL*Plus berulang kali menanyakan nilainya .