Oracle : generation de scripts dynamiques ...

Oracle : generation de scripts dynamiques ... - Programmation

Marsh Posté le 17-12-2001 à 16:24:31    

Bonjour, j'ai un projet Oracle a terminer et je ne sais pas comment attaquer la derniere question :
 
Generation de scripts dynamiques (4 pts sur 20 qd meme ! ;)
Ecrire un script generant un autre script qui devra permettre de recreer une table precise de votre base (choisissez une table ne comportant que des donnees de type char, varchar2, numerique ou date) et y inserer les donnees presentes dans la table d'origine. Optez pour une solution totalement dynamique.
 
Indication donnees par le prof aujourd'hui
Ne pas faire un truc style
Insert into toto
 select * from titi
 
mais utiliser la table ALL_TAB_COLUMNS et la fonction decode ...
 
Toute aide sera bienvenue
 
A+
 
Antoine

Reply

Marsh Posté le 17-12-2001 à 16:24:31   

Reply

Marsh Posté le 17-12-2001 à 16:25:44    

ps: on ne doit pas utiliser de plsql uniquement du sql ...

Reply

Marsh Posté le 18-12-2001 à 21:37:17    

H  H
H  H
HHHH
H  H
H  Help

Reply

Marsh Posté le 19-12-2001 à 05:02:58    

le principe est d'ecrire ton script de creation de la table...
et donc tu devras concatener des bouts de script...
Il me semble qu'il existe une commande du genre :
 
create table blabla as (select...)
Et tout ca dans une cmde que jsais plus ce ke c :D

Reply

Marsh Posté le 19-12-2001 à 09:17:33    

chte fais ca :-)))


---------------
Tef : "Je dors à poil" <-> That's me, poil-bonhomme ! Sp*m killer
Reply

Marsh Posté le 19-12-2001 à 09:23:10    

tu utilise du sql*plus ou pas?


---------------
Tef : "Je dors à poil" <-> That's me, poil-bonhomme ! Sp*m killer
Reply

Marsh Posté le 19-12-2001 à 10:13:59    

:hello: bon, j'ai une soluce, mais c pas un truc tout fait:
 
Prompt &User
Prompt &Table
 
select 'CREATE TABLE ' || table_name || ' (' from user_tables
where table_name = &Table;
 
 
 
 
select COLUMN_NAME , DATA_TYPE, DECODE(NULLABLE,'Y',' ','N','NOT NULL';) ||  
DECODE(rownum, (select count(*) from user_tab_column where table_name = '&Table' and OWNER = '&User';),';) ',', ';)
from all_tab_columns
where table_name = '&Table'
and OWNER = '&User'
order by rownum;
 
le dernier ordre select fonctionne pas: manifestement, on peut pas mettre de select dans la clause select.... ce qui pose un bleme pour la derniere virgule :gun:  
 
soluce:
 
select COLUMN_NAME , DATA_TYPE, DECODE(NULLABLE,'Y',' ','N','NOT NULL';) || ','
from all_tab_columns
where table_name = '&Table'
and OWNER = '&User'
order by rownum;
 
ca pue, car il fo retirer la derniere virgule a la main et la remplacer par une parenthese.... y'a moyen de faire ca avec une jointure de la table ( x2) mais bon, ca serait super lourd.
 
sinon, quand on veut pas se casser le cul, comme disait wouatouwouatou plus haut:
 
create table essai1 as select * from essai2;
 
et basta !
 
oublie pas le insert into ...
 
si ton prof a une bonne solution, envoie moi ca en pv stp, ca m'interesse! :bounce:

 

[edtdd]--Message édité par stefes007--[/edtdd]


---------------
Tef : "Je dors à poil" <-> That's me, poil-bonhomme ! Sp*m killer
Reply

Marsh Posté le 19-12-2001 à 10:35:28    

merci, sinon pour le coup de  
insert into destination
   select * from source;
 
ca marche pas dans le cas present car le but de la requete est de generer un fichier independant capable de recreer la table toute seule (exactement comme phpmyadmin pour mysql) de la forme
create table blablablabla
insert into destination blabla values blabla
....
insert into destination blabla values blabla
 
voila
 
A+

Reply

Marsh Posté le 19-12-2001 à 11:46:17    

je viens de faire un truc a peu pres propre qui marche pour generer une copie de la table etudiants (apres je mettrai un prompt pour que ca passe avec une table choisie par l'utilisateur mais je voulais pas taper tout le temps le meme nom donc j'ai code en statique cette partie et j'ai gere que pour des varchar car dans ma table de test etudiants il n'y a que des cols de type varchar. Je changerai ca par un decode pour gerer les types number et date par la suite.
 
SQL> desc etudiants
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INE                                       NOT NULL VARCHAR2(11)
 NOM                                       NOT NULL VARCHAR2(100)
 PRENOM                                    NOT NULL VARCHAR2(100)
 BRANCHE                                   NOT NULL VARCHAR2(6)
 
SET ECHO OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SPOOL test.sql
select 'CREATE TABLE ' || table_name||'bak'|| ' (pipeau varchar2(10));'
from user_tables
where table_name = 'ETUDIANTS';
 
select 'ALTER TABLE ' || 'ETUDIANTS' || 'bak ' || 'ADD ('||COLUMN_NAME||' '||DATA_TYPE||'('||DATA_LENGTH||';));'
from all_tab_columns
where table_name='ETUDIANTS';
 
select 'ALTER TABLE '|| 'ETUDIANTS' || 'bak '||'DROP COLUMN pipeau;'
from user_tables
where table_name = 'ETUDIANTS';
 
SPOOL OFF
SET ECHO ON
SET FEEDBACK ON
SET PAGESIZE 24
 
Cela me genere le fichier test.sql : ex:
CREATE TABLE ETUDIANTSbak (pipeau varchar2(10));                                
ALTER TABLE ETUDIANTSbak ADD (INE VARCHAR2(11));                                
ALTER TABLE ETUDIANTSbak ADD (NOM VARCHAR2(100));                                
ALTER TABLE ETUDIANTSbak ADD (PRENOM VARCHAR2(100));                            
ALTER TABLE ETUDIANTSbak ADD (BRANCHE VARCHAR2(6));                              
ALTER TABLE ETUDIANTSbak DROP COLUMN pipeau;  
 
qui marche bien:
il me reste ensuite la partie dure generer toutes les lignes d'insert mais la je bloque ...

Reply

Marsh Posté le 19-12-2001 à 12:07:15    

allez y a pas des masters en sql ici ... :)

Reply

Marsh Posté le 19-12-2001 à 12:07:15   

Reply

Marsh Posté le 19-12-2001 à 12:27:18    

un indice il parait qu'il faut utiliser des updates ! :)

Reply

Marsh Posté le 19-12-2001 à 13:22:23    

je pense a une solution
type
on determine un attribut cle dans la table source
 
on fait une requete qui insere la valeur de la cle dans la destination
   et requete imbriquee qui fait un update pour les differents champs (un update par champs) en parcourant la table all_columns_table, je pense que ca doit marcher par contre ca foire qd il y a plusieur attributs qui forment la cle ...

 

[edtdd]--Message édité par cooltwan--[/edtdd]

Reply

Marsh Posté le 19-12-2001 à 13:59:55    

cooltwan a écrit a écrit :

 
 
SPOOL OFF
SET ECHO ON
SET FEEDBACK ON
SET PAGESIZE 24
 
Cela me genere le fichier test.sql : ex:
CREATE TABLE ETUDIANTSbak (pipeau varchar2(10));                                
ALTER TABLE ETUDIANTSbak ADD (INE VARCHAR2(11));                                
ALTER TABLE ETUDIANTSbak ADD (NOM VARCHAR2(100));                                
ALTER TABLE ETUDIANTSbak ADD (PRENOM VARCHAR2(100));                            
ALTER TABLE ETUDIANTSbak ADD (BRANCHE VARCHAR2(6));                              
ALTER TABLE ETUDIANTSbak DROP COLUMN pipeau;  




 
t'as oublie l'attribut NOT NULL.. utilise le decode que j'ai ecrit.... histoire que ca serve a qqc !


---------------
Tef : "Je dors à poil" <-> That's me, poil-bonhomme ! Sp*m killer
Reply

Marsh Posté le 19-12-2001 à 19:40:28    

ok c note mais j'ai un peu zappe ca car le prof nous a dit que la copie des contraintes n'etait pas obligatoire ...

Reply

Marsh Posté le 19-12-2001 à 19:48:55    

HHEELLLLLPPPP !!!!

Reply

Marsh Posté le 20-12-2001 à 12:44:43    

Sous Oracle j'utilise souvent la syntaxe suivante pour effectuer une copie de sauvegarde d'une table donnée (TEST par exemple):
 
CREATE TABLE TEST_BACKUP AS SELECT * FROM TEST;
 
Et ça te crée la table TEST_BACKUP à l'identique de la table TEST, avec les données dedans ! :)

 

[edtdd]--Message édité par irulan--[/edtdd]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed