导出Oracle数据库字典

 2023-09-06 阅读 20 评论 0

摘要:在创建数据库表时,对应的表列信息存储于一下几个表中,通过以下几个表信息可以导出数据字典。 1 USER_TABLES 用户表信息 2 USER_TAB_COMMENTS 用户表备注信息 3 USER_TAB_COLUMNS 用户表列信息 4 USER_COL_COMMENTS 用户表列备注信息 CREATE OR REPLACE FUNCTIO

在创建数据库表时,对应的表列信息存储于一下几个表中,通过以下几个表信息可以导出数据字典。
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;

测试效果
导出数据字典
可以将结果导出到文档

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/8915.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息