Sql 如何在oracle数据库中查看表中所有列的元数据?

Sql 如何在oracle数据库中查看表中所有列的元数据?,sql,database,oracle,oracle11g,metadata,Sql,Database,Oracle,Oracle11g,Metadata,我想知道允许我们查看oracle数据库中为表定义的所有列的查询 阐述: 表名:有些表有10列 我想知道如何检索所有列名、它们的数据类型以及为任何列定义的任何约束 我想知道如何检索所有列名、它们的数据类型以及为任何列定义的任何约束 为此,您可以查询(取决于授予您的权限)[user | all | dba]_选项卡_列,[user | all | dba]_列,[user | all | dba]_约束视图 下面是一个简单的例子: select decode( t.table_name

我想知道允许我们查看oracle数据库中为表定义的所有列的查询

阐述:

表名:有些表有10列

我想知道如何检索所有列名、它们的数据类型以及为任何列定义的任何约束

我想知道如何检索所有列名、它们的数据类型以及为任何列定义的任何约束

为此,您可以查询(取决于授予您的权限)
[user | all | dba]_选项卡_列
[user | all | dba]_列
[user | all | dba]_约束
视图

下面是一个简单的例子:

 select decode( t.table_name
              , lag(t.table_name, 1) over(order by t.table_name)
              , null
             , t.table_name ) as table_name -- <- just to eliminate 
      , t.column_name                       -- repeated tab_name    
      , t.data_type
      , cc.constraint_name
      , uc.constraint_type
   from user_tab_columns t
        left join user_cons_columns cc
          on (cc.table_name = t.table_name and
              cc.column_name = t.column_name)
        left join user_constraints uc
          on (t.table_name = uc.table_name and
              uc.constraint_name = cc.constraint_name )
 where t.table_name in ('EMPLOYEES', 'DEPARTMENTS');
此外,要检索表的完整规范(如果需要),您可以使用该包的
dbms\u metadata
package和
get\u ddl
函数:

select dbms_metadata.get_ddl('TABLE', 'EMPLOYEES') as table_ddl
  from dual;

 table_ddl
 --------------------------------------------------------------------------------

  CREATE TABLE "HR"."EMPLOYEES"
   ("EMPLOYEE_ID" NUMBER(6,0),
    "FIRST_NAME" VARCHAR2(20),
    "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
    "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
    "PHONE_NUMBER" VARCHAR2(20),
    "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
    "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
    "SALARY" NUMBER(8,2),
    "COMMISSION_PCT" NUMBER(2,2),
    "MANAGER_ID" NUMBER(6,0),
    "DEPARTMENT_ID" NUMBER(4,0),
     CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
     CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")

   -- ... other attributes

   )

嗨,Nicholas Krasnov,我尝试了您的查询,但oracle发现您的两种方法都有错误。当我运行get_ddl时,我得到的错误是:ORA-31603:在模式“Xattrans”ORA-06512:在“SYS.DBMS_METADATA”第5088行ORA-06512:在“SYS.DBMS_METADATA”第7589行ORA-06512:在第1行找不到类型表的对象“Xattable_1”,而在运行查询时,我在第13行ORA-00904:“UC”“CONSTRAINTS_NAME”得到了这个结果:无效标识符
在表上中断\u name
在sql*plus环境中性能更好;)@尼古拉斯·克拉斯诺夫(你可能想测试一下)@Aura确保模式
XATRANS
中存在表
XATable_1
。下面是SQLFIDLE示例:。2)
uc.CONSTRAINTS\u name
(单数)不是您评论中的复数(
uc.CONSTRAINTS\u name
)。
select dbms_metadata.get_ddl('TABLE', 'EMPLOYEES') as table_ddl
  from dual;

 table_ddl
 --------------------------------------------------------------------------------

  CREATE TABLE "HR"."EMPLOYEES"
   ("EMPLOYEE_ID" NUMBER(6,0),
    "FIRST_NAME" VARCHAR2(20),
    "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
    "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
    "PHONE_NUMBER" VARCHAR2(20),
    "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
    "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
    "SALARY" NUMBER(8,2),
    "COMMISSION_PCT" NUMBER(2,2),
    "MANAGER_ID" NUMBER(6,0),
    "DEPARTMENT_ID" NUMBER(4,0),
     CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
     CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")

   -- ... other attributes

   )