sql >> Database >  >> RDS >> Oracle

hoe een dynamische tabel in orakel te maken met dynamische kolomnaam en dynamisch gegevenstype zonder weergaven of een ander tabeltype?

Je kunt geen puntkomma's gebruiken in EXECUTE IMMEDIATE voor enkele verklaringen

Hier is een citaat uit de documentatie :

Verwijder de puntkomma uit 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

Maar er is nog een ander probleem.

U moet begrijpen hoe substitutievariabelen (&variable ) werkt

SQL*Plus vraagt ​​slechts één keer om substitutievariabelen:net voordat het script wordt gecompileerd, voordat het wordt uitgevoerd. En dan worden de variabelen letterlijk vervangen in het script, waarna het wordt gecompileerd en uitgevoerd.

Wanneer u bijvoorbeeld uw script uitvoert, herkent SQL*Plus dat er twee onbekende letterlijke waarden zijn (&colname en &coldata ), en zal u vragen. Als u de waarden 'age' en 'number' opgeeft, zal SQL*Plus het script als volgt herschrijven:

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;

Dus als je een letterlijke tekenreeks aan een variabele wilt toewijzen, en je wilt die tekenreeks van een vervangingsvariabele krijgen, moet je dit doen:

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

Ervan uitgaande dat je 'leeftijd' hebt opgegeven voor colname SQL*Plus converteert dit graag naar:

colname varchar2(30) := 'age';

Dus het plaatsen van een vervangingsvariabele in een lus zorgt er niet voor dat SQL*Plus u herhaaldelijk om zijn waarde vraagt .



  1. Hoe door komma's gescheiden tekst te splitsen in de MySQL-opgeslagen procedure

  2. FOUT 1215:Kan geen externe sleutelbeperking toevoegen bij gebruik van ON DELETE SET NULL

  3. Kan de gegevensbron niet maken met mysql

  4. SELECT max(x) retourneert null; hoe kan ik ervoor zorgen dat het 0 teruggeeft?