Oracle
 sql >> Database >  >> RDS >> Oracle

come creare una tabella dinamica in Oracle con nome di colonna dinamico e tipo di dati dinamico senza visualizzazioni o qualsiasi altro tipo di tabella

Non puoi usare il punto e virgola in EXECUTE IMMEDIATE per dichiarazioni singole

Ecco una citazione dalla documentazione :

Rimuovi il punto e virgola da 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

Ma c'è un altro problema.

Devi capire come le variabili di sostituzione (&variable ) funziona

SQL*Plus richiederà le variabili di sostituzione solo una volta:appena prima della compilazione dello script, prima di eseguirlo. E poi le variabili vengono sostituite nello script testualmente, dopodiché verrà compilato ed eseguito.

Ad esempio, quando esegui lo script, SQL*Plus riconosce che ci sono due letterali sconosciuti (&colname e &coldata ), e ti chiederà. Se fornisci i valori 'età' e 'numero' per loro, SQL*Plus riscriverà lo script in questo modo:

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;

Quindi, se vuoi assegnare una stringa letterale a una variabile e vuoi ottenere quella stringa da una variabile di sostituzione, devi farlo:

colname varchar2(30) := '&colname'; -- notice the single quotes

Supponendo che tu abbia fornito 'età' per colname SQL*Plus lo convertirà felicemente in:

colname varchar2(30) := 'age';

Quindi, posizionare una variabile di sostituzione all'interno di un ciclo non farà in modo che SQL*Plus chieda ripetutamente il suo valore .