ORACLE テーブル名、項目名の列挙

select 
    USER_OBJECTS.OBJECT_TYPE
    -- テーブル情報
    ,USER_TAB_COLS.TABLE_NAME
    ,USER_TAB_COMMENTS.COMMENTS TABLE_COMMENTS

    -- 列情報
    ,USER_TAB_COLS.COLUMN_NAME
    ,USER_TAB_COLS.DATA_TYPE
    ,NVL(USER_TAB_COLS.DATA_PRECISION,USER_TAB_COLS.CHAR_LENGTH) LENGTH
    ,USER_TAB_COLS.DATA_SCALE
    ,USER_TAB_COLS.DATA_LENGTH DATA_BYTE 

    -- 制約条件
    ,USER_CONS_COLUMNS.CONSTRAINT_NAME
    ,USER_CONS_COLUMNS.POSITION
    ,USER_TAB_COLS.NULLABLE
    ,NVL2(USER_CONS_COLUMNS.CONSTRAINT_NAME, USER_CONSTRAINTS.CONSTRAINT_TYPE ,'')

    -- 列 補足情報
    ,USER_TAB_COLS.COLUMN_ID
    ,USER_COL_COMMENTS.COMMENTS COL_COMMENTS

from 
    USER_TAB_COLS 

LEFT JOIN USER_TAB_COMMENTS -- テーブル名のコメントを取得する為のもの
    ON  USER_TAB_COMMENTS.TABLE_NAME = USER_TAB_COLS.TABLE_NAME

LEFT JOIN USER_OBJECTS  -- オブジェクトタイプを取得する為のもの
    ON  USER_OBJECTS.OBJECT_NAME = USER_TAB_COLS.TABLE_NAME

LEFT JOIN USER_COL_COMMENTS  -- 列のコメントを取得する為のもの
    ON  USER_COL_COMMENTS.TABLE_NAME  = USER_TAB_COLS.TABLE_NAME
 AND USER_COL_COMMENTS.COLUMN_NAME = USER_TAB_COLS.COLUMN_NAME

LEFT JOIN USER_CONSTRAINTS -- テーブルに対する制約の種類を特定する為のもの
    ON  USER_CONSTRAINTS.TABLE_NAME = USER_TAB_COLS.TABLE_NAME
    AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P' -- プライマリ制約のみとする

LEFT JOIN USER_CONS_COLUMNS -- 列の制約を取得する為のもの
    ON  USER_CONS_COLUMNS.CONSTRAINT_NAME    = USER_CONSTRAINTS.CONSTRAINT_NAME
    AND USER_CONS_COLUMNS.COLUMN_NAME   = USER_TAB_COLS.COLUMN_NAME

WHERE   
--    (   USER_CONSTRAINTS.CONSTRAINT_TYPE IS NULL OR  USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P') 

-- 削除されているテーブルは、除去する
 not exists (select 'X' from RECYCLEBIN where USER_TAB_COLS.TABLE_NAME = RECYCLEBIN.OBJECT_NAME)

-- 不要なオブジェクトは、除外する
AND USER_OBJECTS.OBJECT_TYPE NOT IN ('INDEX PARTITION','INDEX','TABLE SUBPARTITION','TABLE PARTITION')

ORDER BY 
     TABLE_NAME
    ,COLUMN_ID