2010-06-17 11 views
2

Utilisation de Oracle 10g. Mais maintenant que j'ai les noms des tables, y a-t-il un moyen facile de les parcourir et de faire une 'description' sur chacune d'entre elles dans l'ordre?Noms de tables et boucle à décrire

+0

plus facile à faire "sélectionnez nom_table de user_tables;" que d'interroger dba_tables avec une clause where. – MJB

+0

duplication possible de [décrire la requête avec oracle (.Net Connector)] (http://stackoverflow.com/questions/867731/describe-query-with-oracle-net-connector) – DCookie

Répondre

2

Vous pouvez lancer une requête sur DBA_TAB_COLUMNS (ou USER_TAB_COLUMNS).

Nicolas.

+0

Et assurez-vous de les trier correctement (sur COLUMN_ID), sinon les colonnes ne ressembleront pas à ce que vous attendez. – MJB

1

Vous n'êtes pas sûr de pouvoir faire une description depuis PL/SQL. J'ai juste essayé d'utiliser execute immediate 'describe some_table', cela ne fonctionne pas non plus. Votre choix suivant serait d'interroger DBA_TAB_COLUMNS, ou de créer un nouveau fichier avec toutes vos instructions describe (en utilisant dbms_output de pl/sql et spool pour créer le fichier), puis exécutez ce fichier. Peut-être comme ceci:

spool temp_file.sql 
BEGIN 
    /*or you could have a loop here with as many put_lines as you need, it will all end up in the new script file.*/ 
    dbms_output.put_line('describe some_table'); 
END; 
/
spool off 
@temp_file.sql 
/*I have not actually tried running this code, beware syntax errors!*/ 
+0

Vous ne pouvez pas le faire à partir de PL/SQL - vous avez raison. C'est parce que "describe", comme "set", "copy", et quelques autres commandes, est en fait une commande SQLPlus, pas une instruction SQL. Donc en dehors de cet environnement, vous ne pouvez pas l'exécuter. Vous pouvez le dire car il ne nécessite aucun point-virgule terminal à exécuter. Les instructions SQL, qu'elles soient DML ou DDL, requièrent des points-virgules ou un caractère de terminaison autre que [Enter] pour envoyer à la base de données. – MJB

0

Je recommande dba_tab_columns l'interrogation, comme N. Gasparotto a suggéré, mais si vous voulez vraiment décrire la sortie puis créer un fichier mulit-describe.sql ce qui suit:

set pagesize 0 
set termout off 
set feedback off 
set verify off 

spool mdtmp.sql 
select 'describe ' || owner || '.' || table_name 
from dba_tables 
where OWNER = upper('&1') 
/

spool off 
set termout on 
@mdtmp.sql 

dans SQL * PLUS géré par:

@multi-describe ME 
+0

Nice, c'est la bonne réponse –

1

Vous pouvez le faire en PL/SQL en utilisant DBMS_METADATA.GET_DDL, par exemple (Exemple tiré de documents):

SET LONG 2000000 
SET PAGESIZE 0 
SELECT DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT') FROM DUAL; 
1
  1. connexion avec l'utilisateur, puis exécuter les commandes suivantes, le premier fichier contiendra le décrivent les commandes et le second fichier est le fichier désiré contenant toutes les descriptions de toutes tables pour utilisateur connecté

    spool desctables.sql 
    select 'describe '||table_name||';' from user_tables; 
    spool off 
    spool alltables.txt 
    @desctables.sql 
    spool off 
    
+0

cela a fonctionné très bien pour moi, j'ai eu quelques problèmes dans ce premier la ligne de commande était trop longue (j'avais 500 tables) donc je l'ai cassé en lots de 100, ensuite je devais enlever la "commande>" en haut et en bas, enfin j'ai dû enlever le "< " and " >" qui enveloppait chaque déclaration de décrire (j'aurais probablement dû l'éteindre). Je vous remercie! – JGlass