获取 Oracle 所有引用的键列的数据类型和特定的数据长度 table

Get Oracle all referenced key columns datatype and data length of particular table

使用下面的查询,我可以获得所有引用表的列表、列名,我还想获得列数据类型和数据长度。请帮助我查询如何获取数据类型和长度。

SELECT DISTINCT 
    C.TABLE_NAME CHILD_TABLENAME, C.COLUMN_NAME
FROM 
    (SELECT 
         A.CONSTRAINT_NAME,
         A.CONSTRAINT_TYPE,
         A.TABLE_NAME,
         B.COLUMN_NAME,
         A.R_CONSTRAINT_NAME,
         B.POSITION
     FROM 
         USER_CONSTRAINTS A, USER_CONS_COLUMNS B
     WHERE 
         B.CONSTRAINT_NAME = A.CONSTRAINT_NAME
         AND A.CONSTRAINT_TYPE = 'R') C,
    USER_CONS_COLUMNS D
WHERE 
    D.CONSTRAINT_NAME = C.R_CONSTRAINT_NAME
    AND D.TABLE_NAME = 'Member'
    AND D.POSITION = C.POSITION;
with your_data as
(
SELECT DISTINCT C.TABLE_NAME CHILD_TABLENAME,C.COLUMN_NAME
FROM (SELECT A.CONSTRAINT_NAME,
A.CONSTRAINT_TYPE,
A.TABLE_NAME,
B.COLUMN_NAME,
A.R_CONSTRAINT_NAME,
B.POSITION
FROM USER_CONSTRAINTS A, USER_CONS_COLUMNS B
WHERE B.CONSTRAINT_NAME = A.CONSTRAINT_NAME
AND A.CONSTRAINT_TYPE = 'R') C,
USER_CONS_COLUMNS D
WHERE D.CONSTRAINT_NAME = C.R_CONSTRAINT_NAME
AND D.TABLE_NAME = 'DEPT'
AND D.POSITION = C.POSITION
)
select y.*, c.data_type
from your_data y, user_tab_columns c
where y.child_tablename = c.table_name
and y.column_name = c.column_name;

从 user_tab_columns

添加您喜欢的任何列

我怀疑你的table名字真的是Member,通常都是upper-case。您不需要任何 sub-query。试试这个:

SELECT con.TABLE_NAME, 
    con.CONSTRAINT_NAME, 
    con_cols.COLUMN_NAME, 
    cols.DATA_TYPE, 
    cols.DATA_LENGTH,
    ref_con.TABLE_NAME AS REF_TABLE_NAME, 
    ref_con.CONSTRAINT_NAME AS REF_CONSTRAINT_NAME, 
    ref_con_cols.COLUMN_NAME AS REF_COLUMN_NAME, 
    ref_cols.DATA_TYPE AS REF_DATA_TYPE, 
    ref_cols.DATA_LENGTH AS REF_DATA_LENGTH
FROM USER_CONSTRAINTS con 
    JOIN USER_CONS_COLUMNS con_cols ON con_cols.CONSTRAINT_NAME = con.CONSTRAINT_NAME
    JOIN USER_TAB_COLUMNS cols ON cols.TABLE_NAME = con_cols.TABLE_NAME AND cols.COLUMN_NAME = con_cols.COLUMN_NAME
    JOIN USER_CONSTRAINTS ref_con ON ref_con.CONSTRAINT_NAME = con.R_CONSTRAINT_NAME
    JOIN USER_CONS_COLUMNS ref_con_cols ON ref_con.CONSTRAINT_NAME = ref_con_cols.CONSTRAINT_NAME AND ref_con_cols.POSITION = con_cols.POSITION
    JOIN USER_TAB_COLUMNS ref_cols ON ref_cols.TABLE_NAME = ref_con_cols.TABLE_NAME AND ref_cols.COLUMN_NAME = ref_con_cols.COLUMN_NAME
WHERE con.CONSTRAINT_TYPE = 'R'
    AND con.TABLE_NAME = 'MEMBER';

或使用 CTE:

WITH c AS (
    SELECT con.TABLE_NAME, con.CONSTRAINT_NAME, 
        con_cols.COLUMN_NAME, cols.DATA_TYPE, cols.DATA_LENGTH,
        con.CONSTRAINT_TYPE, con.R_CONSTRAINT_NAME, con_cols.POSITION 
    FROM USER_CONSTRAINTS con 
        JOIN USER_CONS_COLUMNS con_cols ON con_cols.CONSTRAINT_NAME = con.CONSTRAINT_NAME
        JOIN USER_TAB_COLUMNS cols ON cols.TABLE_NAME = con_cols.TABLE_NAME AND cols.COLUMN_NAME = con_cols.COLUMN_NAME)
SELECT c.TABLE_NAME, 
    c.CONSTRAINT_NAME, 
    c.COLUMN_NAME, 
    c.DATA_TYPE, 
    c.DATA_LENGTH,
    ref_c.TABLE_NAME AS REF_TABLE_NAME, 
    ref_c.CONSTRAINT_NAME AS REF_CONSTRAINT_NAME, 
    ref_c.COLUMN_NAME AS REF_COLUMN_NAME, 
    ref_c.DATA_TYPE AS REF_DATA_TYPE, 
    ref_c.DATA_LENGTH AS REF_DATA_LENGTH
FROM c
    JOIN c ref_c ON c.R_CONSTRAINT_NAME = ref_c.CONSTRAINT_NAME AND c.POSITION = ref_c.POSITION
WHERE c.CONSTRAINT_TYPE = 'R'
    AND c.TABLE_NAME = 'MEMBER';