Je kunt geen puntkomma's gebruiken in EXECUTE IMMEDIATE
voor enkele verklaringen
Hier is een citaat uit de documentatie :
Verwijder de puntkomma uit 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
Maar er is nog een ander probleem.
U moet begrijpen hoe substitutievariabelen (&variable
) werkt
SQL*Plus vraagt slechts één keer om substitutievariabelen:net voordat het script wordt gecompileerd, voordat het wordt uitgevoerd. En dan worden de variabelen letterlijk vervangen in het script, waarna het wordt gecompileerd en uitgevoerd.
Wanneer u bijvoorbeeld uw script uitvoert, herkent SQL*Plus dat er twee onbekende letterlijke waarden zijn (&colname
en &coldata
), en zal u vragen. Als u de waarden 'age' en 'number' opgeeft, zal SQL*Plus het script als volgt herschrijven:
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;
Dus als je een letterlijke tekenreeks aan een variabele wilt toewijzen, en je wilt die tekenreeks van een vervangingsvariabele krijgen, moet je dit doen:
colname varchar2(30) := '&colname'; -- notice the single quotes
Ervan uitgaande dat je 'leeftijd' hebt opgegeven voor colname
SQL*Plus converteert dit graag naar:
colname varchar2(30) := 'age';
Dus het plaatsen van een vervangingsvariabele in een lus zorgt er niet voor dat SQL*Plus u herhaaldelijk om zijn waarde vraagt .