Ce problème très intéressant est de créer une procédure stockée pour prendre les paramètres du nom de la table oldTable et du nom de la nouvelle table newTable . Les noms des colonnes de la nouvelle table doivent être les valeurs de la première ligne de l'ancienne table. et le reste des rangs sont satisfaits. Jusqu'à présent, j'ai réussi si je connais le nombre de colonnes comme indiqué dans la requête suivante. Ceci est nécessaire pour importer des données à partir d'un outil mais il n'y a pas d'option pour sélectionner la ligne d'en-tête, les colonnes sont nommées comme champ_1, champ_2 etc. dans cet outil.
--Following is a solution but does not work when number of columns vary :
SELECT 'CREATE TABLE NEWTABLE AS SELECT ' || REGEXP_REPLACE(FIELD_0, '[^a-zA-Z'']')
|| ',' || REGEXP_REPLACE(FIELD_1, '[^a-zA-Z'']')
|| ',' ||REGEXP_REPLACE(FIELD_2, '[^a-zA-Z'']')
|| ' FROM (SELECT ROWNUM R,'
|| 'FIELD_0 ' || REGEXP_REPLACE(FIELD_0, '[^a-zA-Z'']', '')
|| ', FIELD_1 ' || REGEXP_REPLACE(FIELD_1, '[^a-zA-Z'']', '')
|| ', FIELD_2 ' || REGEXP_REPLACE(FIELD_2, '[^a-zA-Z'']', '')
|| ' FROM test) WHERE R <> 1'
FROM oldTable
WHERE ROWNUM = 1
Ici, l'ancienne table est structurée comme suit
CREATE TABLE oldTable
( "FIELD_0" VARCHAR2(30),
"FIELD_1" VARCHAR2(30),
"FIELD_2" VARCHAR2(30)
) ;
insert into oldTable (FIELD_0, FIELD_1, FIELD_2)
values ('a', 'b', 'c');
insert into oldTable (FIELD_0, FIELD_1, FIELD_2)
values ('apple', 'ball', 'cat');
insert into oldTable (FIELD_0, FIELD_1, FIELD_2)
values ('1', '23', '4');
Old Table
FIELD_0 FIELD_1 FIELD_2
1 a b c
2 apple ball cat
3 1 23 4
NewTable (First row of old table is Column of new table)
a b c
1 apple ball cat
2 1 23 4
J'essaie de créer une solution qui fonctionne avec n'importe quel tableau avec n'importe quel nombre de colonnes, la solution devrait être utile à de nombreuses personnes s'il y en a une.
Il pourrait y avoir une solution si nous pouvions faire une boucle à travers les valeurs et les colonnes comme indiqué ci-dessous.
BEGIN
FOR col IN (select column_name
from cols
where upper(table_name) = upper('oldTable')) LOOP
--Some code here
END LOOP;
END;