sql >> Databasteknik >  >> RDS >> Oracle

hur man skapar dynamisk tabell i Oracle med dynamiskt kolumnnamn och dynamisk datatyp utan några vyer eller någon annan tabelltyp

Du kan inte använda semikolon i EXECUTE IMMEDIATE för enskilda påståenden

Här är ett citat från dokumentationen :

Ta bort semikolonet från 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

Men det finns ett annat problem.

Du måste förstå hur substitutionsvariabler (&variable ) fungerar

SQL*Plus kommer att fråga efter ersättningsvariabler endast en gång:precis innan skriptet kompileras, innan det körs. Och sedan ersätts variablerna i skriptet ordagrant, varefter det kompileras och exekveras.

Till exempel, när du kör ditt skript känner SQL*Plus igen att det finns två okända bokstaver (&colname och &coldata ), och kommer att fråga efter dig. Om du anger värdena 'age' och 'number' för dem, kommer SQL*Plus att skriva om skriptet så här:

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;

Så om du vill tilldela en sträng bokstavlig till en variabel, och du vill hämta den strängen från en substitutionsvariabel, måste du göra så här:

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

Förutsatt att du angav 'ålder' för colname SQL*Plus konverterar gärna detta till:

colname varchar2(30) := 'age';

Så, att placera en ersättningsvariabel i en loop kommer inte att få SQL*Plus att upprepade gånger fråga dig om dess värde .



  1. Apache NiFi

  2. MySQL select-sats med alias misslyckas med kolumn hittades inte

  3. Få hierarkinivå och alla nodreferenser på Oracle

  4. PostgreSQL parametriserad Order By / Limit i tabellfunktion