2010-06-17 2 views
2

Работа в Oracle 10g. Простой способ перечислить все имена таблиц (выберите имя_таблицы из dba_tables, где owner = 'me') Но теперь, когда у меня есть имена таблиц, есть ли простой способ их прокрутки и последовательное «описать» на каждом из них?Имена таблиц и цикл для описания

+0

Легче сделать "выбрать table_name из user_tables;" чем запрос dba_tables с предложением where. – MJB

+0

Возможный дубликат [описать запрос с помощью oracle (.Net Connector)] (http://stackoverflow.com/questions/867731/describe-query-with-oracle-net-connector) – DCookie

ответ

2

Вы можете запросить запрос DBA_TAB_COLUMNS (или USER_TAB_COLUMNS).

Николас.

+0

И не забудьте отсортировать их соответствующим образом (в COLUMN_ID), иначе столбцы не будут выглядеть так, как вы ожидаете. – MJB

1

Не уверен, что вы можете описать из PL/SQL. Я просто попытался использовать execute immediate 'describe some_table', что тоже не работает. Следующий выбор - запросить DBA_TAB_COLUMNS или создать новый файл со всеми вашими инструкциями описания (используя dbms_output из pl/sql и spool для создания файла), а затем выполнить этот файл. Может быть, как это:

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

Вы не можете сделать это из PL/SQL - вы правы. Это потому, что «описать», например «набор», «копировать» и некоторые другие команды, на самом деле является командой SQLPlus, а не оператором SQL. Поэтому вне этой среды вы не можете ее выполнить. Вы можете сказать, потому что он не требует выполнения терминальной полуколоны. Операторы SQL, независимо от того, являются ли они DML или DDL, для отправки в базу данных требуют полуколония или какой-либо завершающий символ, отличный от [Enter]. – MJB

0

Я рекомендовал бы запрашивая dba_tab_columns, как это было предложено Н. Gasparotto, но если вы действительно хотите описать выход затем создать файл MULIT-describe.sql со следующим:

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 

в SQL * PLUS управляет:

@multi-describe ME 
+0

Ничего страшного, это правильный ответ –

1

Вы можете сделать это в PL/SQL с помощью DBMS_METADATA.GET_DDL, например, (Пример взят из документации):

SET LONG 2000000 
SET PAGESIZE 0 
SELECT DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT') FROM DUAL; 
1
  1. вход с пользователем, а затем выполнить следующие команды, первый файл будет содержать описания команд, а второй файл будет нужный файл, содержащий все описания всех столы для зарегистрированного пользователя

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

Это сработало отлично для меня, у меня было несколько проблем, потому что первая строка командной строки была слишком длинной (у меня было 500 таблиц), поэтому я разбил ее на партии по 100, после чего мне пришлось удалить «command>» вверху и внизу, наконец мне пришлось удалить «< " and " >», который завернул каждую инструкцию описания (я, вероятно, должен был отключить ее). Спасибо! – JGlass

Смежные вопросы