【问题标题】:Table names, and loop to describe表名和循环来描述
【发布时间】:2010-06-17 14:31:27
【问题描述】:

在 Oracle 10g 中工作。列出所有表名的简单方法(从 dba_tables where owner = 'me' 中选择 table_name) 但是现在我有了表名,是否有一种简单的方法可以遍历它们并按顺序对每个表进行“描述”?

【问题讨论】:

标签: sql oracle describe


【解决方案1】:

您可以查询 DBA_TAB_COLUMNS(或 USER_TAB_COLUMNS)。

尼古拉斯。

【讨论】:

  • 并确保对它们进行适当的排序(在 COLUMN_ID 上),否则列将不像您预期​​的那样。
【解决方案2】:

不确定是否可以从 PL/SQL 中进行描述。我刚刚尝试使用execute immediate 'describe some_table',也不起作用。您的下一个选择是查询 DBA_TAB_COLUMNS,或者使用您的所有描述语句创建一个新文件(使用 pl/sql 中的 dbms_output 和 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!*/

【讨论】:

  • 你不能从 PL/SQL 中做到这一点——你是对的。那是因为“describe”和“set”、“copy”和其他一些命令一样,实际上是SQLPlus命令,而不是SQL语句。所以在那个环境之外,你不能执行它。你可以知道,因为它不需要终端分号来执行。 SQL 语句,无论是 DML 还是 DDL,都需要分号或 [Enter] 以外的一些终止字符发送到数据库。
【解决方案3】:

您可以在 PL/SQL 中使用 DBMS_METADATA.GET_DDL 执行此操作,例如(示例取自文档):

SET LONG 2000000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT') FROM DUAL;

【讨论】:

    【解决方案4】:
    1. 使用用户登录,然后运行以下命令,第一个文件将包含描述命令,第二个文件将是包含登录用户所有表的所有描述的所需文件

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

    【讨论】:

    • 这对我很有用,我确实有几个问题,首先命令行太长(我有 500 个表)所以我将它分成 100 个批次,接下来我必须删除“command>”在顶部和底部,最后我不得不删除包裹每个描述语句的“”(我可能应该关闭它)。谢谢!
    【解决方案5】:

    我建议按照 N. Gasparotto 的建议查询 dba_tab_columns,但如果您真的想要描述输出,则使用以下内容创建一个文件 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2020-06-05
      • 2020-11-01
      • 2016-10-01
      相关资源
      最近更新 更多