Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment créer une table dynamique dans oracle avec un nom de colonne dynamique et un type de données dynamique sans aucune vue ou tout autre type de table

Vous ne pouvez pas utiliser de points-virgules dans EXECUTE IMMEDIATE pour les relevés uniques

Voici une citation de la documentation :

Supprimez le point-virgule de 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

Mais il y a un autre problème.

Vous devez comprendre comment les variables de substitution (&variable ) fonctionne

SQL*Plus ne demandera les variables de substitution qu'une seule fois :juste avant la compilation du script, avant de l'exécuter. Et puis les variables sont remplacées dans le script mot pour mot, après quoi il sera compilé et exécuté.

Par exemple, lorsque vous exécutez votre script, SQL*Plus reconnaît qu'il existe deux littéraux inconnus (&colname et &coldata ), et vous demandera. Si vous leur fournissez les valeurs 'age' et 'number', SQL*Plus réécrira le script comme ceci :

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;

Ainsi, si vous souhaitez affecter un littéral de chaîne à une variable et que vous souhaitez obtenir cette chaîne à partir d'une variable de substitution, vous devez procéder comme suit :

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

En supposant que vous ayez fourni 'age' pour colname SQL*Plus se fera un plaisir de le convertir en :

colname varchar2(30) := 'age';

Ainsi, placer une variable de substitution à l'intérieur d'une boucle ne fera pas que SQL*Plus vous demande à plusieurs reprises sa valeur .