EXECUTE IMMEDIATE
ではセミコロンを使用できません 単一のステートメントの場合
これは、ドキュメント からの引用です。 :
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
しかし、別の問題があります。
置換変数(&variable
)を理解する必要があります )動作します
SQL * Plusは、置換変数の入力を1回だけ要求します。つまり、スクリプトがコンパイルされる直前、スクリプトを実行する前です。そして、変数はスクリプト内で逐語的に置き換えられ、その後コンパイルされて実行されます。
たとえば、スクリプトを実行すると、SQL * Plusは2つの不明なリテラル(&colname
)があることを認識します。 および&coldata
)、およびプロンプトが表示されます。値「age」および「number」を指定すると、SQL*Plusはスクリプトを次のように書き直します。
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;
したがって、文字列リテラルを変数に割り当て、その文字列を置換変数から取得する場合は、次のようにする必要があります。
colname varchar2(30) := '&colname'; -- notice the single quotes
colname
に「age」を指定したと仮定します SQL * Plusは、これを次のように変換します。
colname varchar2(30) := 'age';
したがって、 ループ内に置換変数を配置しても、SQL*Plusがその値の入力を繰り返し求めることはありません 。