V EXECUTE IMMEDIATE
nelze použít středníky pro jednotlivé příkazy
Zde je citát z dokumentace :
Odeberte středník z 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
Ale je tu další problém.
Musíte pochopit, jak substituční proměnné (&variable
) funguje
SQL*Plus vyzve k zadání substitučních proměnných pouze jednou:těsně před kompilací skriptu, před jeho spuštěním. A pak jsou proměnné nahrazeny ve skriptu doslovně, poté se zkompiluje a spustí.
Když například spustíte skript, SQL*Plus rozpozná, že existují dva neznámé literály (&colname
a &coldata
), a vyzve vás. Pokud pro ně zadáte hodnoty 'věk' a 'číslo', SQL*Plus přepíše skript takto:
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;
Pokud tedy chcete přiřadit řetězcový literál k proměnné a chcete tento řetězec získat ze substituční proměnné, musíte udělat toto:
colname varchar2(30) := '&colname'; -- notice the single quotes
Za předpokladu, že jste uvedli 'věk' pro colname
SQL*Plus to šťastně převede na:
colname varchar2(30) := 'age';
Takže umístěním substituční proměnné do smyčky nebude SQL*Plus opakovaně vyžadovat její hodnotu .