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
)
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 –
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ệ –
'ngắt trên table_name' sẽ hoạt động tốt hơn trong môi trường sql * plus;) –