Du kan ikke bruge semikolon i EXECUTE IMMEDIATE
for enkelte udsagn
Her er et citat fra dokumentationen :
Fjern semikolon fra 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
Men der er et andet problem.
Du skal forstå, hvordan substitutionsvariabler (&variable
) virker
SQL*Plus beder kun om substitutionsvariabler én gang:lige før scriptet kompileres, før det køres. Og så erstattes variablerne i scriptet ordret, hvorefter det bliver kompileret og eksekveret.
For eksempel, når du kører dit script, genkender SQL*Plus, at der er to ukendte bogstaver (&colname
og &coldata
), og vil bede dig. Hvis du angiver værdierne 'age' og 'number' for dem, vil SQL*Plus omskrive scriptet sådan her:
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;
Så hvis du vil tildele en streng literal til en variabel, og du vil hente den streng fra en substitutionsvariabel, skal du gøre dette:
colname varchar2(30) := '&colname'; -- notice the single quotes
Forudsat at du har angivet 'alder' for colname
SQL*Plus vil med glæde konvertere dette til:
colname varchar2(30) := 'age';
Så at placere en substitutionsvariabel inde i en løkke vil ikke få SQL*Plus til at spørge dig gentagne gange om dens værdi .