sql >> Databáze >  >> RDS >> Oracle

jak vytvořit dynamickou tabulku v oracle s dynamickým názvem sloupce a dynamickým datovým typem bez jakýchkoli pohledů nebo jakéhokoli jiného typu tabulky

V EXECUTE IMMEDIATE nelze použít středníky pro jednotlivé příkazy

Zde je citát z dokumentace :

Odeberte středník z 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

Ale je tu další problém.

Musíte pochopit, jak substituční proměnné (&variable ) funguje

SQL*Plus vyzve k zadání substitučních proměnných pouze jednou:těsně před kompilací skriptu, před jeho spuštěním. A pak jsou proměnné nahrazeny ve skriptu doslovně, poté se zkompiluje a spustí.

Když například spustíte skript, SQL*Plus rozpozná, že existují dva neznámé literály (&colname a &coldata ), a vyzve vás. Pokud pro ně zadáte hodnoty 'věk' a 'číslo', SQL*Plus přepíše skript takto:

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;

Pokud tedy chcete přiřadit řetězcový literál k proměnné a chcete tento řetězec získat ze substituční proměnné, musíte udělat toto:

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

Za předpokladu, že jste uvedli 'věk' pro colname SQL*Plus to šťastně převede na:

colname varchar2(30) := 'age';

Takže umístěním substituční proměnné do smyčky nebude SQL*Plus opakovaně vyžadovat její hodnotu .



  1. Kámo, kdo vlastní ten #temp stůl?

  2. Jaký je význam otazníku v MySQL ve sloupci WHERE =??

  3. PostgreSQL/výkon jeden obecný kurzor nebo vytvořit pro každý dotaz

  4. Jak volat REPLACE s CLOB (bez překročení 32K)