数据库类型研究

我从USER_TAB_COLS中取内容,从USER_COL_COMMENTS中取备注可以得到下面的表结构

SELECT 
USER_TAB_COLS.COLUMN_ID AS 列序号 ,
USER_TAB_COLS.COLUMN_NAME AS 列名 , 
USER_TAB_COLS.DATA_TYPE AS 数据类型,
USER_TAB_COLS.DATA_LENGTH AS 长度,
USER_TAB_COLS.NULLABLE AS 是否可空,
USER_COL_COMMENTS.COMMENTS AS 备注
FROM USER_TAB_COLS
INNER 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
WHERE USER_TAB_COLS.TABLE_NAME = 'AI_HFSC_ZH_CHK' ORDER BY 列序号

但是如果用plsql查询该表的表结构,可以发现不一样的状况

如果出错,那一定是我的语句找错了,那么,我应该怎么改这个语句,让我得到的数据与plsql提供的表结构数据一致呢?

select A.COLUMN_ID as 列序号,
       A.COLUMN_NAME as 列名,
       case
         when A.DATA_TYPE = 'CHAR' then
          A.DATA_TYPE || '(' || A.DATA_LENGTH || ')'
         when A.DATA_TYPE = 'VARCHAR2' then
          A.DATA_TYPE || '(' || A.DATA_LENGTH || ')'
         when A.DATA_TYPE = 'DATE' then
          A.DATA_TYPE
         when A.DATA_TYPE = 'NUMBER' and A.DATA_PRECISION IS NULL AND
              a.DATA_SCALE = 0 then
          'INTEGER'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE = 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE != 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
       END as 数据类型,
     
       decode(C.COLUMN_NAME, null, '', '') as 主键,
       decode(A.NULLABLE, 'Y', '') as 可为空,
       B.comments as 备注
  from sys.user_tab_cols A,
        sys.user_col_comments B,
       (select col.column_name, c.table_name, col.owner
          from user_constraints c, user_cons_columns col   
         where c.constraint_name = col.constraint_name   and
         c.constraint_type = 'P') C
 where upper(A.TABLE_NAME) = 'AI_HFSC_ZH_CHK'   
       and A.TABLE_NAME = B.table_name   
       and A.COLUMN_NAME = B.column_name
     and A.Table_Name = C.TABLE_NAME(+)   
       and A.COLUMN_NAME = C.COLUMN_NAME(+)   
 
 order by A.TABLE_NAME, A.Column_Id

如果说查询当前User所有的外键

--查询外键约束的列名: 
select ucc.constraint_name,ucc.table_name,ucc.column_name
from user_cons_columns ucc 
left join user_constraints uc on uc.constraint_name=ucc.constraint_name
where uc.constraint_type='R' ;

 然后加入对于外键的查询    

-----------解决了外键的问题,但时  数据类型、备注 又出问题了
select A.COLUMN_ID as 列序号,
       A.COLUMN_NAME as 列名,
       case
         when A.DATA_TYPE = 'CHAR' then
          A.DATA_TYPE || '(' || A.DATA_LENGTH || ')'
         when A.DATA_TYPE = 'VARCHAR2' then
          A.DATA_TYPE || '(' || A.DATA_LENGTH || ')'
         when A.DATA_TYPE = 'DATE' then
          A.DATA_TYPE
         when A.DATA_TYPE = 'NUMBER' and A.DATA_PRECISION IS NULL AND
              a.DATA_SCALE = 0 then
          'INTEGER'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE = 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE != 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
       END as 数据类型,
       decode(C.COLUMN_NAME, null, '', '') as 主键,
       decode(d.constraint_name,null, '', '') as 外键,
       decode(A.NULLABLE, 'Y', '') as 可为空,
       B.comments as 备注
  from sys.user_tab_cols A,
        sys.user_col_comments B,
       (select col.column_name, c.table_name, col.owner
          from user_constraints c, user_cons_columns col   
         where c.constraint_name = col.constraint_name   and
         c.constraint_type = 'P') C,
         (select ucc.constraint_name,ucc.table_name,ucc.column_name
from user_cons_columns ucc 
left join user_constraints uc on uc.constraint_name=ucc.constraint_name
where uc.constraint_type='R') D
  
 where A.TABLE_NAME = 'ACT_RU_JOB'   
       and A.TABLE_NAME = B.table_name   
       and A.COLUMN_NAME = B.column_name
     and A.Table_Name = C.TABLE_NAME(+)   
       and A.COLUMN_NAME = C.COLUMN_NAME(+)   
       and a.TABLE_NAME=d.table_name(+) and a.COLUMN_NAME=d.column_name(+)
 order by A.TABLE_NAME, A.Column_Id

 应该是什么地方出错了

想了想,修改后可以得到


-----------和plsql的column选项卡完全一样的表格
SELECT A.COLUMN_ID as 列序号,
       A.COLUMN_NAME as 列名,
       case
         when A.DATA_TYPE in ('CHAR', 'NCHAR') then
          A.DATA_TYPE || '(' || A.CHAR_COL_DECL_LENGTH || ')'
         when A.DATA_TYPE in ('VARCHAR2', 'NVARCHAR2''RAW') then
          A.DATA_TYPE || '(' || A.CHAR_LENGTH || ')'
         when A.DATA_TYPE = 'FLOAT' then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
         when A.DATA_TYPE = 'UROWID' then
          A.DATA_TYPE || '(' || A.DATA_LENGTH || ')'
         when A.DATA_TYPE = 'NUMBER' and A.DATA_PRECISION IS NULL AND
              a.DATA_SCALE = 0 then
          'INTEGER'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE = 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ')'
         when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE != 0 then
          A.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
         else
          A.DATA_TYPE
       END as 数据类型,
       c.primary_enable as 主键,
       d.foreign_enable as 外键,
       decode(A.NULLABLE, 'Y', '') as 可为空,
       B.comments as 备注
  from sys.user_tab_cols A
  left join sys.user_col_comments B
    on A.TABLE_NAME = B.table_name
   and A.COLUMN_NAME = B.column_name

  left join (select col.column_name,
                    c.table_name,
                    case
                      when col.COLUMN_NAME is not null and
                           c.status = 'ENABLED' then
                       ''
                      else
                       ''
                    end as primary_enable
               from user_constraints c, user_cons_columns col   
              where c.constraint_name = col.constraint_name   and
              c.constraint_type = 'P') C
    on A.Table_Name = C.TABLE_NAME
   and A.COLUMN_NAME = C.COLUMN_NAME
  left join (select uc.constraint_name,
                    ucc.table_name,
                    ucc.column_name,
                    case
                      when ucc.COLUMN_NAME is not null and
                           uc.status = 'ENABLED' then
                       ''
                      else
                       ''
                    end as foreign_enable
               from user_cons_columns ucc
               left join user_constraints uc
                 on uc.constraint_name = ucc.constraint_name
              where uc.constraint_type = 'R') D
    on A.Table_Name = D.TABLE_NAME
   and A.COLUMN_NAME = D.COLUMN_NAME
 where A.TABLE_NAME = '{tableInfo.TableName}'
 order by A.TABLE_NAME, A.COLUMN_ID

 或者使用和原数据表一样的列名

SELECT A.COLUMN_ID as 列序号,A.COLUMN_NAME as 列名,
                           case
                             when A.DATA_TYPE = 'NUMBER' and A.DATA_PRECISION IS NULL AND a.DATA_SCALE = 0 then
                              'INTEGER'
                             when A.DATA_TYPE = 'TIMESTAMP(6)'then
                              'TIMESTAMP'
                             else
                               A.DATA_TYPE
                           END as 数据类型,
                                                      
                           case
                             when A.DATA_TYPE in ('CHAR','NCHAR') then
                              to_char(A.CHAR_COL_DECL_LENGTH)
                             when A.DATA_TYPE in ('VARCHAR2','NVARCHAR2''RAW','UROWID') then
                              to_char(A.CHAR_LENGTH)
                             when A.DATA_TYPE = 'FLOAT' then
                              to_char(A.DATA_PRECISION)
                             when A.DATA_TYPE = 'NUMBER' and A.DATA_PRECISION IS NULL AND a.DATA_SCALE = 0 then
                              ''
                             when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE = 0 then
                              to_char(A.DATA_PRECISION)
                             when A.DATA_TYPE = 'NUMBER' AND a.DATA_SCALE != 0 then
                              to_char(A.DATA_PRECISION || ',' || A.DATA_SCALE)
                             when A.DATA_TYPE = 'TIMESTAMP(6)' then
                              '6'
                              ELSE
                               ''
                           END as 长度,
                           c.primary_enable as 主键,d.foreign_enable as 外键,decode(A.NULLABLE, 'Y', '') as 可为空,B.comments as 备注
                      from sys.user_tab_cols A
                      left join sys.user_col_comments B on A.TABLE_NAME = B.table_name
                       and A.COLUMN_NAME = B.column_name

left join (select col.column_name, c.table_name,case when col.COLUMN_NAME is not null and c.status='ENABLED' then '' else '' end as primary_enable
                                   from user_constraints c, user_cons_columns col   
      where c.constraint_name = col.constraint_name   and
                                  c.constraint_type = 'P') C
                        on A.Table_Name = C.TABLE_NAME
                       and A.COLUMN_NAME = C.COLUMN_NAME
                      left join (select uc.constraint_name, ucc.table_name, ucc.column_name,case when ucc.COLUMN_NAME is not null and uc.status='ENABLED' then '' else '' end as foreign_enable
                                   from user_cons_columns ucc
                                   left join user_constraints uc
                                     on uc.constraint_name = ucc.constraint_name
                                  where uc.constraint_type = 'R') D
                        on A.Table_Name = D.TABLE_NAME
                       and A.COLUMN_NAME = D.COLUMN_NAME
                     where A.TABLE_NAME = '{tableInfo.TableName}'
                     order by A.TABLE_NAME, A.COLUMN_ID

当然,处理得还不足够完善,

原文地址:https://www.cnblogs.com/adamgq/p/12213758.html