comment créer de la dynamique de la table dans oracle avec dynamique de nom de colonne et dynamique de type de données avec toutes les vues ou de tout autre type de table
Merci pour tout,Nous pouvons créer un tableau dynamiquement avec l'aide de execute immediate
requête. Mais lorsque l'on crée une table, il est créé, mais si je voulais créer un tableau dynamiquement avec la dynamique n'a de colonnes, alors la question qui a été soulevée. En fait, j'ai créé une table, mais quand j'ai créé pas de colonnes avec la table, puis beaucoup d'erreurs soulevées. Voici le code que j'ai écrit dans l'Oracle dans une procédure.
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20);
coldata varchar2(20);
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
age:='age';
datf:='number'
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=datf;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
ce code d'exécution avec quatre colonnes du même type si no_of_cols est 5.Puis j'avais modifié le code et exécutez le plsql programme.le programme est comme suit
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20);
age varchar2(20);
datf varchar2(20);
coldata varchar2(20);
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
age :=&age;
datf:=&datf;
colname:=age;
coldata:=datf;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
Les éléments suivants sont les erreurs générées lors de la procédure ci-dessus est créé
[Error] Execution (13: 19): ORA-06550: line 13, column 19:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted string literal with character set specification>
<an alternatively
j'avais fait quelques modifications pour le dessus de plsql,puis le plsql code comme suit
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20):='&colname';
coldata varchar2(20):='&coldata';
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
puis après l'exécution j'obtiens l'erreur suivante et il doenot lire le nom de colonne dynamiquement
[Error] Execution (1: 1): ORA-02263: need to specify the datatype for this column
ORA-06512: at line 10
&
). De Plus, vous ne pouvez pas créer une table vide et ajouter des colonnes - vous besoin de concaténer des chaînes de caractères en un seul create table (...)
chaîne et seulement ensuite exécuter immédiate."beaucoup d'erreurs soulevées." Quels ont été les errorz qui ont été soulevées?
j'ai oublié de mentionner ces erreurs maintenant, j'avais modifié la question
ce client vous aide à exécuter le présent? Est-il SQL*Plus?
Crapaud 12c et oracle 11g en tant que client
OriginalL'auteur Smart003 | 2014-07-23
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser des points-virgules dans
EXECUTE IMMEDIATE
pour de simples déclarationsVoici une citation de la la documentation:
Supprimez le point-virgule de
EXECUTE IMMEDIATE
.Mais il y a un autre problème.
Vous avez besoin de comprendre comment les variables de substitution (
&variable
) fonctionneSQL*Plus invite à une substitution de variables qu'une seule fois: juste avant que le script compile, avant de l'exécuter. Et puis les variables sont remplacées dans le script verbatim, après quoi il sera compilé et exécuté.
Par exemple, lorsque vous exécutez votre script, SQL*Plus, reconnaît qu'il y a deux inconnues littéraux (
&colname
et&coldata
), et vous invite à vous. Si vous fournissez les valeurs " âge " et "numéro" pour eux, SQL*Plus, va réécrire le script comme ceci:Donc, si vous voulez affecter une chaîne de caractères littérale à une variable, et vous souhaitez obtenir cette chaîne à partir d'une variable de substitution, vous devez faire ceci:
En supposant que vous avez fourni " âge " pour
colname
SQL*Plus sera heureux de convertir cette:Donc, de placer une variable de substitution à l'intérieur d'une boucle ne fera pas de SQL*Plus, à plusieurs reprises vous invite pour une valeur.
;
dans l'exécution immédiate de la déclaration. mais le problème est que si le no_of_cols est 5 alors je voulais cinq colonnes différentes, mais en utilisant le code ci-dessus je les ai toutes en double colonnesOui, la réponse est que "placer une variable de substitution à l'intérieur d'une boucle ne fera pas de SQL*Plus, à plusieurs reprises vous invite pour sa valeur." Si vous ne pouvez pas le faire. Sera la recherche d'une manière de le faire et de revenir à vous.
grâce à vous, j'ai eu un autre message d'erreur.Il ne prend pas le nom de colonne lors de l'exécution et il une erreur d'affichage du nom de [Erreur] Exécution (1: 1): ORA-02263: besoin de spécifier le type de données de cette colonne ORA-06512: à ligne 10
En fait, j'ai un problème lorsque j'avais créé avec une autre table, puis j'ai obtenu l'erreur [Erreur] Exécution (1: 1): ORA-02263: besoin de spécifier le type de données de cette colonne ORA-06512: à ligne 10 et table ou de la vue n'a pas de sortie
OriginalL'auteur sampathsris
Pour mieux comprendre et analyser vous devez faire comme ceci:
Qu'est-ce que l'Instruction SQL générée?
cette déclaration est 'alter table <table-name> ajouter <column-name> type de données'
OriginalL'auteur Wernfried Domscheit