Du kan inte använda semikolon i EXECUTE IMMEDIATE
för enskilda påståenden
Här är ett citat från dokumentationen :
Ta bort semikolonet från 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 det finns ett annat problem.
Du måste förstå hur substitutionsvariabler (&variable
) fungerar
SQL*Plus kommer att fråga efter ersättningsvariabler endast en gång:precis innan skriptet kompileras, innan det körs. Och sedan ersätts variablerna i skriptet ordagrant, varefter det kompileras och exekveras.
Till exempel, när du kör ditt skript känner SQL*Plus igen att det finns två okända bokstaver (&colname
och &coldata
), och kommer att fråga efter dig. Om du anger värdena 'age' och 'number' för dem, kommer SQL*Plus att skriva om skriptet så här:
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å om du vill tilldela en sträng bokstavlig till en variabel, och du vill hämta den strängen från en substitutionsvariabel, måste du göra så här:
colname varchar2(30) := '&colname'; -- notice the single quotes
Förutsatt att du angav 'ålder' för colname
SQL*Plus konverterar gärna detta till:
colname varchar2(30) := 'age';
Så, att placera en ersättningsvariabel i en loop kommer inte att få SQL*Plus att upprepade gånger fråga dig om dess värde .