2012-11-19 12 views

risposta

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.

Per fare questo è possibile eseguire una query (a seconda privilegi concessi a voi) [user|all|dba]_tab_columns, [user|all|dba]_cons_columns, [user|all|dba]_constraints vista.

Ecco un rapido esempio:

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

Risultato:

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 

anche per recuperare una specifica completa (se necessario) di una tabella, è possibile utilizzare dbms_metadata pacchetto e get_ddl funzione di quel pacchetto:

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

Ciao Nicholas Krasnov, ho provato le tue richieste ma sto ricevendo errore di om oracle per entrambi i tuoi metodi. Quando sto facendo funzionare il get_ddl sto ottenendo ERRORE: ORA-31603: oggetto "XATable_1" del tipo di tabella non trovato nello schema "XATRANS" ORA-06512: alla "SYS.DBMS_METADATA", la linea 5088 ORA-06512: a "SYS.DBMS_METADATA", la linea 7589 ORA-06512: alla linea 1 –

+0

E durante l'esecuzione della query sto ottenendo questo in linea n ° 13 ORA-00904: "CONSTRAINTS_NAME" "UC":. identificativo valido –

+0

'pausa su table_name' funzionerebbe meglio in sql * plus environment;) –

Problemi correlati