在创建数据库表时,对应的表列信息存储于一下几个表中,通过以下几个表信息可以导出数据字典。
1 USER_TABLES 用户表信息
2 USER_TAB_COMMENTS 用户表备注信息
3 USER_TAB_COLUMNS 用户表列信息
4 USER_COL_COMMENTS 用户表列备注信息
CREATE OR REPLACE FUNCTION GET_DATA_DICTIONARY(V_SPACE_NAME VARCHAR2,--表空间V_TABLE_LIKE VARCHAR2--表名)RETURN DATA_DIC_TAB ISCURSOR CUR_TABS ISSELECT A.TABLE_NAME,B.comments,C.COLUMN_NAME,DECODE(C.CHAR_LENGTH,0,DECODE(C.DATA_SCALE,NULL,C.DATA_TYPE,C.DATA_TYPE || '(' || C.DATA_PRECISION || ',' ||C.DATA_SCALE || ')'),C.DATA_TYPE || '(' || C.CHAR_LENGTH || ')') DATA_TYPE,C.NULLABLE NULLABLE,D.comments REMARKFROM USER_TABLES A,USER_TAB_COMMENTS B,user_tab_columns C,user_col_comments DWHERE A.TABLE_NAME = B.TABLE_NAMEAND A.table_name = C.table_nameAND C.COLUMN_NAME = D.COLUMN_NAMEAND C.TABLE_NAME = D.table_nameAND A.TABLESPACE_NAME = upper(V_SPACE_NAME)AND A.TABLE_NAME LIKE '%' || upper(V_TABLE_LIKE) || '%'ORDER BY A.TABLE_NAME, C.COLUMN_ID;V_DATA_DIC_ITEM DATA_DIC_ITEM;V_DATA_DIC_TAB DATA_DIC_TAB := DATA_DIC_TAB();V_DATA_DIC_ITEM_TITLE DATA_DIC_ITEM;V_DATA_DIC_ITEM_NULL DATA_DIC_ITEM;V_TAB_NAME VARCHAR2(50);beginV_DATA_DIC_ITEM_TITLE := DATA_DIC_ITEM('表名','表中文名','列名','数据类型','是否可为空','备注');V_DATA_DIC_ITEM_NULL := DATA_DIC_ITEM('', '', '', '', '', '');for c_tab in CUR_TABS loop--不同表名时赋值空行和表头行if V_TAB_NAME is null or (V_TAB_NAME <> c_tab.TABLE_NAME) thenif V_TAB_NAME IS NOT NULL THEN--添加空行V_DATA_DIC_TAB.EXTEND;V_DATA_DIC_TAB(V_DATA_DIC_TAB.COUNT) := V_DATA_DIC_ITEM_NULL;end if;--添加表头V_DATA_DIC_TAB.EXTEND;V_DATA_DIC_TAB(V_DATA_DIC_TAB.COUNT) := V_DATA_DIC_ITEM_TITLE;--添加实体内容V_DATA_DIC_ITEM := DATA_DIC_ITEM(c_tab.table_name,c_tab.comments,c_tab.column_name,c_tab.data_type,c_tab.nullable,c_tab.remark);V_DATA_DIC_TAB.EXTEND;V_DATA_DIC_TAB(V_DATA_DIC_TAB.COUNT) := V_DATA_DIC_ITEM;--首次循环赋初始值if V_TAB_NAME IS NULL THENV_TAB_NAME := c_tab.table_name;END IF;--非首次循环在下次循环至下表时重新赋值if V_TAB_NAME IS NOT NULL AND V_TAB_NAME <> c_tab.table_name THENV_TAB_NAME := c_tab.table_name;END IF;--同表名时赋值实体内容ELSE--添加实体内容V_DATA_DIC_ITEM := DATA_DIC_ITEM(c_tab.table_name,c_tab.comments,c_tab.column_name,c_tab.data_type,c_tab.nullable,c_tab.remark);V_DATA_DIC_TAB.EXTEND;V_DATA_DIC_TAB(V_DATA_DIC_TAB.COUNT) := V_DATA_DIC_ITEM;END IF;end loop;return V_DATA_DIC_TAB;
end;
测试效果
可以将结果导出到文档
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态