查询数据字典生成表字段信息,支持MySQL,Oracle,DB2

开发初期需要了解表功能和表关系,为了便于观察,我习惯把表结构平铺展示。于是写了句查询SQL,通过数据字典生成表的字段信息。

把SQL查询结果复制到文本编辑器中
效果如下
Alt

MySQL实现

# MYSQL版本,需要MySQL 8以上
WITH RECURSIVE
    tab_info(TABLE_NAME, TABLE_SCHEMA) AS (
#     在这里输入表名称和schema名称
        SELECT 'jimu_report', 'jeecg-boot'
    ),
    col_info(COLNAME, COL_LEN, TYPE, TYPE_LEN, REMARKS) AS (
        SELECT COLNAME, LENGTH(COLNAME) COL_LEN, TYPE, LENGTH(TYPE) TYPE_LEN, REMARKS
        FROM (
                 SELECT COLUMN_NAME COLNAME, COLUMN_TYPE TYPE, COLUMN_COMMENT REMARKS
                 FROM information_schema.COLUMNS columns,
                      tab_info
                 WHERE columns.TABLE_NAME = tab_info.TABLE_NAME
                   AND columns.TABLE_SCHEMA = tab_info.TABLE_SCHEMA
                 ORDER BY ORDINAL_POSITION
             ) columns
    ),
    max_colname_len(LEN1) AS (
        SELECT MAX(COL_LEN) + 4
        FROM col_info
    ),
    max_type_len(LEN2) AS (
        SELECT MAX(TYPE_LEN) + 4
        FROM col_info
    ),
    blank_repository(NUM, BLANK) AS (
        SELECT 0, CAST('' AS CHAR(40))
        UNION ALL
        SELECT NUM + 1, CONCAT(BLANK, CHAR(32))
        FROM blank_repository
        WHERE NUM < 40
    )
SELECT TABLE_COMMENT, NULL, NULL
FROM information_schema.TABLES tables,
     tab_info
WHERE tables.TABLE_NAME = tab_info.TABLE_NAME
  AND tables.TABLE_SCHEMA = tab_info.TABLE_SCHEMA
  AND TABLE_TYPE = 'BASE TABLE'
UNION ALL
SELECT TABLE_NAME, NULL, NULL
FROM tab_info
UNION ALL
SELECT CONCAT(COLNAME, (SELECT BLANK FROM blank_repository WHERE NUM = LEN1 - COL_LEN)) COLNAME,
       CONCAT(TYPE, (SELECT BLANK FROM blank_repository WHERE NUM = LEN2 - TYPE_LEN))   TYPE,
       REMARKS
FROM col_info,
     max_colname_len,
     max_type_len;

Oracle实现

-- Oracle版本,需要Oracle 11以上
WITH tab_info(TABLE_NAME, TABSCHEMA) AS (
--  在这里输入表名称和schema名称
    SELECT 'T_USER', 'TEST'
    FROM dual
),
     col_info(COLNAME, COL_LEN, TYPE, TYPE_LEN, REMARKS) AS (
         SELECT COLNAME, LENGTH(COLNAME) COL_LEN, TYPE, LENGTH(TYPE) TYPE_LEN, REMARKS
         FROM (
                  SELECT columns.COLUMN_NAME                                                               COLNAME,
                         DATA_TYPE || '(' || DATA_LENGTH || NVL2(DATA_SCALE, ',' || DATA_SCALE, '') || ')' TYPE,
                         remark.COMMENTS                                                                   REMARKS
                  FROM SYS.ALL_TAB_COLUMNS columns
                           INNER JOIN tab_info
                                      ON tab_info.TABLE_NAME = columns.TABLE_NAME
                                          AND tab_info.TABSCHEMA = columns.OWNER
                           INNER JOIN SYS.ALL_COL_COMMENTS remark
                                      ON remark.TABLE_NAME = tab_info.TABLE_NAME
                                          AND remark.COLUMN_NAME = columns.COLUMN_NAME
                                          AND remark.OWNER = tab_info.TABSCHEMA
                  ORDER BY COLUMN_ID
              )
     ),
     max_colname_len(LEN1) AS (
         SELECT MAX(COL_LEN) + 4
         FROM col_info
     ),
     max_type_len(LEN2) AS (
         SELECT MAX(TYPE_LEN) + 4
         FROM col_info
     ),
     blank_repository(NUM, BLANK) AS (
         SELECT 0, CAST('' AS VARCHAR(40))
         FROM dual
         UNION ALL
         SELECT NUM + 1, BLANK || CHR(32)
         FROM blank_repository
         WHERE NUM < 40
     )
SELECT COMMENTS, NULL, NULL
FROM SYS.ALL_TAB_COMMENTS tables,
     tab_info
WHERE tables.TABLE_NAME = tab_info.TABLE_NAME
  AND tables.OWNER = tab_info.TABSCHEMA
  AND TABLE_TYPE = 'TABLE'
UNION ALL
SELECT TABLE_NAME, NULL, NULL
FROM tab_info
UNION ALL
SELECT COLNAME || (SELECT BLANK FROM blank_repository WHERE NUM = LEN1 - COL_LEN) COLNAME,
       TYPE || (SELECT BLANK FROM blank_repository WHERE NUM = LEN2 - TYPE_LEN)   TYPE,
       REMARKS
FROM col_info,
     max_colname_len,
     max_type_len;

DB2实现

-- DB2版本
WITH tab_info(TABLE_NAME, TABSCHEMA) AS (
--  在这里输入表名称和schema名称
    SELECT 'T_USER', 'TEST'
    FROM SYSIBM.DUAL
),
     col_info(COLNAME, COL_LEN, TYPE, TYPE_LEN, REMARKS) AS (
         SELECT COLNAME, LENGTH(COLNAME) COL_LEN, TYPE, LENGTH(TYPE) TYPE_LEN, REMARKS
         FROM (
                  SELECT COLNAME, TYPENAME || '(' || LENGTH || ',' || SCALE || ')' TYPE, REMARKS
                  FROM SYSCAT.COLUMNS columns,
                       tab_info
                  WHERE columns.TABNAME = tab_info.TABLE_NAME
                    AND columns.TABSCHEMA = tab_info.TABSCHEMA
                  ORDER BY COLNO
              )
     ),
     max_colname_len(LEN1) AS (
         SELECT MAX(COL_LEN) + 4
         FROM col_info
     ),
     max_type_len(LEN2) AS (
         SELECT MAX(TYPE_LEN) + 4
         FROM col_info
     ),
     blank_repository(NUM, BLANK) AS (
         VALUES (0, CAST('' AS VARCHAR(40)))
         UNION ALL
         SELECT NUM + 1, BLANK || CHR(32)
         FROM blank_repository
         WHERE NUM < 40
     )
SELECT REMARKS, NULL, NULL
FROM SYSCAT.TABLES tables,
     tab_info
WHERE tables.TABNAME = tab_info.TABLE_NAME
  AND tables.TABSCHEMA = tab_info.TABSCHEMA
  AND TYPE = 'T'
UNION ALL
SELECT TABLE_NAME, NULL, NULL
FROM tab_info
UNION ALL
SELECT COLNAME || (SELECT BLANK FROM blank_repository WHERE NUM = LEN1 - COL_LEN) COLNAME,
       TYPE || (SELECT BLANK FROM blank_repository WHERE NUM = LEN2 - TYPE_LEN)   TYPE,
       REMARKS
FROM col_info,
     max_colname_len,
     max_type_len;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值