Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So erstellen Sie eine dynamische Tabelle in Oracle mit einem dynamischen Spaltennamen und einem dynamischen Datentyp ohne Ansichten oder einen anderen Tabellentyp

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 .