ORACLE pt.3 【エクセルで利用するテーブル定義書を抽出】


EXCELで利用する前提で作ってみました。
権限がないと取得できないかも知れません。
後ろのほうにある upper(o.owner) = 'SCHEMA' に指定する値は環境に合わせて修正してください。
結果をエクセルのシートに貼り付けて利用します。
テーブル書式にしたり、条件付き書式で色分けしたり工夫してください。
フィルタを使うと同じカラム名で型やサイズの違いなど見つけ易いです。
また、新しいシートに張り付けても、EXCELは値のみを張り付けられますので
常に最新のテーブル定義書を利用しましょう。

-- エクセルで利用するテーブル定義書
select o.owner                      as "SCHEMA"
      ,n.comments                   as tableName
      ,c.table_name                 as tableID
      ,c.column_id                  as colNo
      ,d.comments                   as colName
      ,c.column_name                as colID
      ,case upper(c.data_type)
        when 'TIMESTAMP(6)' then
          'TIMESTAMP'
        when 'NVARCHAR2'     then
          c.data_type || '(' || to_char(c.char_length) || ')'
        when 'VARCHAR2'     then
          c.data_type || '(' || to_char(c.char_length) || ')'
        when 'NUMBER'       then
          case
            when ((c.data_precision is null) and (c.data_scale is null)) then
              c.data_type
            else
              c.data_type || '(' || to_char(c.data_precision) || ',' || to_char(c.data_scale) || ')'
          end
        when 'DATE'         then
          c.data_type
        when 'CHAR'         then
          c.data_type || '(' || to_char(c.char_length) || ')'
        when 'LONG'         then
          c.data_type || '(' || to_char(c.data_precision) || ')'
        when 'BLOB'         then
          c.data_type || '(' || to_char(c.data_length) || ')'
        when 'CLOB'         then
          c.data_type || '(' || to_char(c.data_length) || ')'
        when 'NCLOB'       then
          c.data_type || '(' || to_char(c.data_length/2) || ')'
        else
          c.data_type
       end                          as DataType
      ,p.constraint_type            as colPK
      ,q.column_position            as "UNIQUE"
      ,case when pt.column_name is not null then 'PT'
        else ' '
       end                          as PartKey
      ,case c.nullable
        when 'Y' then ''
        else c.nullable
       end                          as nil
      ,c.data_type                  as colType
      ,case upper(c.data_type)
        when 'NVARCHAR2'     then
          to_char(c.char_length)
        when 'VARCHAR2'     then
          to_char(c.char_length)
        when 'NUMBER'       then
          to_char(c.data_precision)
        when 'CHAR'         then
          to_char(c.char_length)
        when 'LONG'         then
          to_char(c.data_precision)
        when 'BLOB'         then
          to_char(c.data_precision)
        when 'CLOB'         then
          to_char(c.data_precision)
        when 'NCLOB'       then
          to_char(c.data_length/2)
        else
          ''
       end                          as colSize
      ,case upper(c.data_type)
        when 'NUMBER'       then
          to_char(c.data_scale)
        else
          ''
       end                          as colScale
  from sys.all_objects                  o
 inner join sys.all_tables              t
    on upper(t.owner)       = upper(o.owner)
   and upper(t.table_name)  = upper(o.object_name)
   and upper(o.object_type) = 'TABLE'
 inner join sys.all_tab_columns         c
    on upper(c.owner)       = upper(t.owner)
   and upper(c.table_name)  = upper(t.table_name)
  left outer join sys.all_tab_comments  n
    on n.owner      = t.owner
   and n.table_name = t.table_name
   and upper(n.table_type) = 'TABLE'
  left outer join sys.all_col_comments  d
    on upper(d.owner)       = upper(c.owner)
   and upper(d.table_name)  = upper(c.table_name)
   and upper(d.column_name) = upper(c.column_name)
  left outer join (select c.table_name
                         ,c.column_name
                         ,case
                            when count(1)=1 then to_char(min(c.position))
                            else 'PU'
                          end constraint_type
                     from user_constraints       u
                    inner join user_cons_columns c
                       on c.table_name      = u.table_name
                      and c.constraint_name = u.constraint_name
                    where u.constraint_type in('U','P','u','p')
                    group by
                          c.table_name
                         ,c.column_name
                  ) p --プライマリキー
    on upper(p.table_name)  = upper(t.table_name)
   and upper(p.column_name) = upper(c.column_name)
  left outer join (select uic.table_name
                         ,uic.column_name
                         ,min(uic.column_position) as column_position
                     from
                          user_indexes     ui
                    inner join
                          user_ind_columns uic
                       on uic.index_name = ui.index_name
                    where
                          upper(ui.uniqueness) = 'UNIQUE'
                    group by
                          uic.table_name
                         ,uic.column_name
                  ) q --ユニークインデックス
    on q.table_name      = c.table_name
   and q.column_position = c.column_id
  left outer join (select distinct nvl(column_name,' ') as column_name
                         ,nvl(name,' ') as table_name
                     from dba_part_key_columns
                    where upper(object_type) = 'TABLE'
                  ) pt --パーティション表
    on pt.table_name  = c.table_name
   and pt.column_name = c.column_name
 where upper(o.owner) = 'スキーマ名'
-- and upper(c.table_name) = 'テーブル名'
 order by
       c.table_name
      ,c.column_id
;