Sie können keine Semikolons in EXECUTE IMMEDIATE
verwenden für einzelne Anweisungen
Hier ist ein Zitat aus der Dokumentation :
Entfernen Sie das Semikolon aus 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
Aber es gibt noch ein anderes Problem.
Sie müssen verstehen, wie Substitutionsvariablen (&variable
) funktioniert
SQL*Plus fordert nur einmal zur Eingabe von Substitutionsvariablen auf:kurz bevor das Skript kompiliert wird, bevor es ausgeführt wird. Und dann werden die Variablen im Skript wörtlich ersetzt, wonach es kompiliert und ausgeführt wird.
Wenn Sie beispielsweise Ihr Skript ausführen, erkennt SQL*Plus, dass es zwei unbekannte Literale gibt (&colname
und &coldata
) und wird nach Ihnen fragen. Wenn Sie die Werte „Alter“ und „Nummer“ dafür angeben, schreibt SQL*Plus das Skript wie folgt um:
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;
Wenn Sie also einer Variablen ein Zeichenfolgenliteral zuweisen und diese Zeichenfolge aus einer Substitutionsvariablen erhalten möchten, müssen Sie Folgendes tun:
colname varchar2(30) := '&colname'; -- notice the single quotes
Angenommen, Sie haben das 'Alter' für colname
angegeben SQL*Plus konvertiert dies gerne in:
colname varchar2(30) := 'age';
Wenn Sie also eine Substitutionsvariable in eine Schleife einfügen, wird SQL*Plus Sie nicht wiederholt nach ihrem Wert fragen .