sql >> Base de Datos >  >> RDS >> Oracle

cómo crear una tabla dinámica en Oracle con un nombre de columna dinámico y un tipo de datos dinámicos sin vistas ni ningún otro tipo de tabla

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 .