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

hvordan man opretter dynamisk tabel i Oracle med dynamisk kolonnenavn og dynamisk datatype uden nogen visninger eller enhver anden tabeltype

Du kan ikke bruge semikolon i EXECUTE IMMEDIATE for enkelte udsagn

Her er et citat fra dokumentationen :

Fjern semikolon fra 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 der er et andet problem.

Du skal forstå, hvordan substitutionsvariabler (&variable ) virker

SQL*Plus beder kun om substitutionsvariabler én gang:lige før scriptet kompileres, før det køres. Og så erstattes variablerne i scriptet ordret, hvorefter det bliver kompileret og eksekveret.

For eksempel, når du kører dit script, genkender SQL*Plus, at der er to ukendte bogstaver (&colname og &coldata ), og vil bede dig. Hvis du angiver værdierne 'age' og 'number' for dem, vil SQL*Plus omskrive scriptet sådan her:

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å hvis du vil tildele en streng literal til en variabel, og du vil hente den streng fra en substitutionsvariabel, skal du gøre dette:

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

Forudsat at du har angivet 'alder' for colname SQL*Plus vil med glæde konvertere dette til:

colname varchar2(30) := 'age';

at placere en substitutionsvariabel inde i en løkke vil ikke få SQL*Plus til at spørge dig gentagne gange om dens værdi .



  1. Rails SELECT 40001 SQL_NO_CACHE affyret fra ukendt sted

  2. Sådan erstattes en kommasepareret værdi i tabelkolonnen med brugerinputværdien oracle

  3. Indstil en offentlig standardprofil for databasemail (SSMS)

  4. Autoincrement i oracle med seq og trigger - ugyldig sql-sætning