No puede usar punto y coma en EXECUTE IMMEDIATE
para declaraciones individuales
Aquí hay una cita de la documentación :
Elimina el punto y coma de 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
Pero hay otro problema.
Debe comprender cómo las variables de sustitución (&variable
) funciona
SQL*Plus solicitará las variables de sustitución solo una vez:justo antes de que se compile el script, antes de ejecutarlo. Y luego las variables se reemplazan en el script palabra por palabra, después de lo cual se compilará y ejecutará.
Por ejemplo, cuando ejecuta su script, SQL*Plus reconoce que hay dos literales desconocidos (&colname
y &coldata
) y se lo solicitará. Si proporciona los valores 'edad' y 'número' para ellos, SQL*Plus reescribirá el script de esta manera:
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;
Entonces, si desea asignar un literal de cadena a una variable y desea obtener esa cadena de una variable de sustitución, debe hacer esto:
colname varchar2(30) := '&colname'; -- notice the single quotes
Suponiendo que proporcionó 'edad' para colname
SQL*Plus felizmente convertirá esto a:
colname varchar2(30) := 'age';
Por lo tanto, colocar una variable de sustitución dentro de un bucle no hará que SQL*Plus le solicite repetidamente su valor .