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
Répondre
Vous pouvez lancer une requête sur DBA_TAB_COLUMNS (ou USER_TAB_COLUMNS).
Nicolas.
Et assurez-vous de les trier correctement (sur COLUMN_ID), sinon les colonnes ne ressembleront pas à ce que vous attendez. – MJB
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!*/
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
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
Nice, c'est la bonne réponse –
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;
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
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
plus facile à faire "sélectionnez nom_table de user_tables;" que d'interroger dba_tables avec une clause where. – MJB
duplication possible de [décrire la requête avec oracle (.Net Connector)] (http://stackoverflow.com/questions/867731/describe-query-with-oracle-net-connector) – DCookie