2012-11-19 23 views
9

Tôi muốn biết Truy vấn cho phép chúng ta xem tất cả các cột được xác định cho một bảng trong cơ sở dữ liệu oracle.Làm cách nào để xem tất cả Siêu dữ liệu của các cột trong bảng trong cơ sở dữ liệu oracle?

Xây dựng:

Tên bảng: Some_Table có 10 cột.

Tôi muốn biết cách tôi có thể truy xuất tất cả các tên cột, kiểu dữ liệu và bất kỳ ràng buộc nào được xác định cho bất kỳ cột nào.

Trả lời

19

I want to know how I can retrieve the all column names, their data type, and any constraints that are defined for any column.

Để làm điều đó bạn có thể truy vấn (tùy thuộc vào đặc quyền được cấp cho bạn) [user|all|dba]_tab_columns, [user|all|dba]_cons_columns, [user|all|dba]_constraints quan điểm.

Dưới đây là một ví dụ nhanh:

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'); 

Kết quả:

TABLE_NAME COLUMN_NAME  DATA_TYPE  CONSTRAINT_NAME CONSTRAINT_TYPE 
------------- ----------------- -------------- ------------------------------- 
DEPARTMENTS LOCATION_ID  NUMBER   DEPT_LOC_FK  R 
       DEPARTMENT_ID  NUMBER   DEPT_ID_PK  P 
       DEPARTMENT_NAME VARCHAR2  DEPT_NAME_NN  C 
       MANAGER_ID  NUMBER   DEPT_MGR_FK  R 
EMPLOYEES  SALARY   NUMBER   EMP_SALARY_MIN C 
       PHONE_NUMBER  VARCHAR2        
       EMPLOYEE_ID  NUMBER   EMP_EMP_ID_PK  P 
       DEPARTMENT_ID  NUMBER   EMP_DEPT_FK  R 
       JOB_ID   VARCHAR2  EMP_JOB_FK  R 
       MANAGER_ID  NUMBER   EMP_MANAGER_FK R 
       COMMISSION_PCT NUMBER        
       FIRST_NAME  VARCHAR2        
       JOB_ID   VARCHAR2  EMP_JOB_NN  C 
       HIRE_DATE   DATE   EMP_HIRE_DATE_NN C 
       EMAIL    VARCHAR2  EMP_EMAIL_NN  C 
       LAST_NAME   VARCHAR2  EMP_LAST_NAME_NN C 
       EMAIL    VARCHAR2  EMP_EMAIL_UK  U 

17 rows selected 

Ngoài ra để lấy một đặc điểm kỹ thuật đầy đủ (nếu cần thiết) của một bảng, bạn có thể sử dụng dbms_metadata gói và get_ddl chức năng mà gói:

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 

    ) 
+0

Hi Nicholas Krasnov, tôi đã thử truy vấn của bạn nhưng tôi gặp lỗi fr om oracle cho cả hai phương pháp của bạn. Khi tôi chạy get_ddl, tôi đang nhận được L ERI: ORA-31603: đối tượng "XATable_1" loại TABLE không được tìm thấy trong giản đồ "XATRANS" ORA-06512: tại "SYS.DBMS_METADATA", dòng 5088 ORA-06512: tại "SYS.DBMS_METADATA", dòng 7589 ORA-06512: tại dòng 1 –

+0

Và trong khi chạy truy vấn, tôi nhận được dòng này tại số 13 ORA-00904: "UC". "CONSTRAINTS_NAME": số nhận dạng không hợp lệ –

+0

'ngắt trên table_name' sẽ hoạt động tốt hơn trong môi trường sql * plus;) –

Các vấn đề liên quan