`
wsql
  • 浏览: 11716517 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

根据实体生成数据模型方案

 
阅读更多

在日常的项目中,常常会遇到根据表结构或实体的属性向数据库中生成表,然后根据数据库中的表结构反向生成数据模型的情况。这种情况如果直接处理会比较麻烦,我们设计了如下根据实体属性反向生成数据模型的方案。
1、建表及插入测试数据

建表、插入测试数据.sql

--1、建存储表结构数据字典表和SQL语句存储表
-- Create table
create table TAB_STRUCTURE
(
  TABLE_NAME   VARCHAR2(30) not null,
  TAB_COMMENTS VARCHAR2(4000),
  COLUMN_NAME  VARCHAR2(30) not null,
  COL_COMMENTS VARCHAR2(4000)
);
-- Add comments to the table 
comment on table TAB_STRUCTURE
  is '表结构字典表';
-- Add comments to the columns 
comment on column TAB_STRUCTURE.TAB_COMMENTS
  is '等同表中文名';
comment on column TAB_STRUCTURE.COL_COMMENTS
  is '等同列中文名';
  
-- Create table
create table TAB_CREATESQL
(
  TAB_CREATE_SCRIPT CLOB
);
--2、插入测试数据
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '学生编号', '学生编号');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '姓名', '姓名');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '性别', '性别');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '年级', '年级');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '身高', '身高');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('学生表', '学生表', '体重', '体重');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('科目表', '科目表', '科目编号', '科目编号');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('科目表', '科目表', '科目名称', '科目名称');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('科目表', '科目表', '代课老师', '代课老师');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('成绩表', '成绩表', '科目编号', '科目编号');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('成绩表', '成绩表', '学生编号', '学生编号');
insert into tab_structure (TABLE_NAME, TAB_COMMENTS, COLUMN_NAME, COL_COMMENTS)
values ('成绩表', '成绩表', '成绩', '成绩');

2、根据在表中存储的表结构信息生成建表脚本

P_CREATETAB_FROM_TABSTRUCTURE.prc

CREATE OR REPLACE PROCEDURE P_CREATETAB_FROM_TABSTRUCTURE AS
  V_CLOB_CREATE_TABLE CLOB;
  V_CLOB_COMMENT_TABCOL CLOB;
BEGIN
  DBMS_LOB.CREATETEMPORARY(V_CLOB_CREATE_TABLE,TRUE,DBMS_LOB.CALL);
  DBMS_LOB.OPEN(V_CLOB_CREATE_TABLE,DBMS_LOB.LOB_READWRITE);
  DBMS_LOB.CREATETEMPORARY(V_CLOB_COMMENT_TABCOL,TRUE,DBMS_LOB.CALL);
  DBMS_LOB.OPEN(V_CLOB_COMMENT_TABCOL,DBMS_LOB.LOB_READWRITE);
  
  EXECUTE IMMEDIATE 'TRUNCATE TABLE TAB_CREATESQL';
  /*
  CREATE TABLE TAB_CREATESQL (TAB_CREATE_SCRIPT CLOB);
  SELECT * FROM TAB_CREATESQL;
  */
  FOR C_TAB IN (
SELECT (CASE WHEN RN = MINRN THEN 
       '--表'||TABLE_NAME||'的结构生成'||CHR(10)||'CREATE TABLE ' || SUBSTR(TABLE_NAME,1,32) || '('||CHR(10) ELSE NULL END) AS CREATE_TAB_HEAD,
       COL_NAME || ' ' || DEFAULT_TYPE || (CASE WHEN RN = MAXRN THEN ');'||CHR(10) ELSE ','||CHR(10) END) CREATE_TAB_BODY,
       (CASE WHEN RN=MINRN THEN 
       '--表'||TABLE_NAME||'的表及列注释的生成'||CHR(10)||'COMMENT ON TABLE '||TABLE_NAME||' IS '''||TAB_COMMENTS||''';'||CHR(10) ELSE NULL END) COMMENT_TAB,
       'COMMENT ON COLUMN '||TABLE_NAME||'.'||COL_NAME ||' IS '''||COL_COMMENTS||''';'||CHR(10) COMMENT_COL
  FROM (SELECT TABLE_NAME, (CASE WHEN CNT=1 THEN COL_NAME ELSE COL_NAME||FLAG END) COL_NAME, DEFAULT_TYPE, TAB_COMMENTS,COL_COMMENTS,RN,
               MIN(RN) OVER(PARTITION BY TABLE_NAME) MINRN,
               MAX(RN) OVER(PARTITION BY TABLE_NAME) MAXRN
          FROM (SELECT TABLE_NAME, COL_NAME, DEFAULT_TYPE, TAB_COMMENTS,COL_COMMENTS,
                       COUNT(COL_NAME) OVER(PARTITION BY TABLE_NAME, COL_NAME) CNT,
                       ROW_NUMBER() OVER(PARTITION BY TABLE_NAME, COL_NAME ORDER BY COL_NAME) FLAG,
                       ROW_NUMBER() OVER(PARTITION BY TABLE_NAME ORDER BY ROWID) RN  --取一个表中列的行号,此处以rowid排序,建议在表TAB_STRUCTURE中增加表内部列的行号进行排序
                  FROM (SELECT F_GET_FRIST_PINY(REGEXP_REPLACE(A.TAB_COMMENTS,'\(.+\)|(.+)|','')) TABLE_NAME,  --处理表名中带括号的注释性内容,不作表英文名
                               A.TAB_COMMENTS,
                               F_GET_FRIST_PINY(REGEXP_REPLACE(A.COL_COMMENTS,'\(.+\)|(.+)|^.+:','')) COL_NAME, --处理列名中带括号的注释性内容,不作列英文名
                               'VARCHAR2(500)' DEFAULT_TYPE,
                               A.COL_COMMENTS
                          FROM TAB_STRUCTURE A)) --用到了一个取拼音首字母的函数,此函数见百度博客http://hi.baidu.com/nsj820/item/da7b4c11d3f1f4731109b564
         ORDER BY TABLE_NAME, RN)) LOOP

     DBMS_LOB.WRITEAPPEND(V_CLOB_CREATE_TABLE,LENGTH(C_TAB.CREATE_TAB_HEAD||C_TAB.CREATE_TAB_BODY),C_TAB.CREATE_TAB_HEAD||C_TAB.CREATE_TAB_BODY);
     DBMS_LOB.WRITEAPPEND(V_CLOB_COMMENT_TABCOL,LENGTH(C_TAB.COMMENT_TAB||C_TAB.COMMENT_COL),C_TAB.COMMENT_TAB||C_TAB.COMMENT_COL);
     
    END LOOP;

    DBMS_LOB.APPEND(V_CLOB_CREATE_TABLE,V_CLOB_COMMENT_TABCOL);
    INSERT INTO TAB_CREATESQL(TAB_CREATE_SCRIPT) VALUES(V_CLOB_CREATE_TABLE);
    COMMIT;

    DBMS_LOB.CLOSE(V_CLOB_CREATE_TABLE);
    DBMS_LOB.CLOSE(V_CLOB_COMMENT_TABCOL);
    DBMS_LOB.FREETEMPORARY(V_CLOB_CREATE_TABLE);
    DBMS_LOB.FREETEMPORARY(V_CLOB_COMMENT_TABCOL);

END P_CREATETAB_FROM_TABSTRUCTURE;
/

3、执行建表脚本到数据库中;最后将数据库中的表反向生成PowerDesigner物理模型表中的字段类型,根据实际需要进行更改即可

分享到:
评论

相关推荐

    大数据仓库建模方法.doc

    一、 什么是数据模型 数据模型是抽象描述现实世界的一种工具和方法,是通过抽象的实体及实体之间 联系的形式,来表示现实世界中事务的相互关系的一种映射。在这里,数据模型表现 的抽象的是实体和实体之间的关系,...

    代码生成器Mgicode生成器JAVA代码生成器

    修改实体之后,会帮助你找到所有需要修改的东西,并且给出最佳的修改方案。 统一代码编程风格(如同一项目中选择几种不同日历控制) 把自己的项目模板化(关系化),方便之后使用 把模板化的项目放到Mgicode市场...

    海大数据库原理综合实验六

    (1) 收集真实数据或者生成模拟数据。 (2) 批量加载数据到数据库中。 (3) 设计一系列SQL语句,尤其是连接查询、嵌套查询等SQL语句,已测试数据库性能。 3 实验要求 (1) 可以借助POWERDESIGNER等系统分析与...

    大数据仓库与大数据挖掘课程教学设计.doc

    逻辑建模是数据仓库实施中的重要一环,因为它能直接反映出各个业务的需求,同 时对系统的物理实施有着重要的指导作用,它的作用在于可以通过实体和关系勾勒出企 业的数据蓝图,数据仓库的逻辑模型设计任务主要有:...

    人工智能-项目实践-C#-基于C#的实体模型框架.zip

    常用解决方案有两种,第一种是进行全面的封装,第二种是使用代码生成器支持。由于数据的多样性,很难做到大一统的良好封装,所以我们另辟蹊径,只进行简单的封装,将复杂性通过海量代码来解决。同时,也可以避免封装...

    电子沙盘平台设计方案.docx

    5 态势图生成 2 6 运动路径仿真模块 7 地形数据处理 6 8 地形分析 5 9 立式多点触控屏一体机 电子沙盘平台设计方案全文共5页,当前为第5页。 电子沙盘平台设计方案全文共5页,当前为第5页。 电子沙盘平台设计方案

    基于三维实景数字孪生生城市解决方案.pptx

    数据支持:该方案提供了全面的数据支持,包括三维模型数据、传感器数据、历史数据和实时数据等。这些数据不仅为城市管理者提供了决策依据,还为城市规划、设计、建设和管理提供了有力支持。 灵活性和可扩展性:该...

    基于三维实景数字孪生生城市解决方案 .docx

    数据支持:该方案提供了全面的数据支持,包括三维模型数据、传感器数据、历史数据和实时数据等。这些数据不仅为城市管理者提供了决策依据,还为城市规划、设计、建设和管理提供了有力支持。 灵活性和可扩展性:该...

    PowerDesigner15.1汉化破解版.z01

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    电子沙盘平台设计方案(1).docx

    万元) 1 三维数字地球平台 8 2 大地景管理模块 10 3 动态场景模拟 8 4 图形标绘 5 5 态势图生成 2 6 运动路径仿真模块 7 地形数据处理 6 8 地形分析 5 9 立式多点触控屏一体机 电子沙盘平台设计方案(1)全文共4页,...

    model:PHP mysql 模型使用 ZF2

    数据模型 模型论 数据库设计符号 模特经理 一般描述 获取方法 添加(添加方法) 更改(更新方法) 删除方法 导入(删除方法) 链接(链接方法) 1. 链接的理论和类型 2. 数据库中链接的生成 3. 添加链接 实体实体...

    PowerDesigner15.1汉化破解版.z04

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    PowerDesigner15.1汉化破解版.z02

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    PowerDesigner15.1汉化破解版.z06

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    PowerDesigner15.1汉化破解版.z05

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    PowerDesigner15.1汉化破解版.z03

    最常用的应该是PDM(物理数据模型)了,在PDM中设计数据库(包括表、试图、触发器,到表的主外键、索引等等都涉及到)然后配置好数据库连接后就能生成数据库实体了。析和设计到自动生成编码)将精力集中在实现商业...

    电子沙盘平台设计方案.doc

    电子沙盘平台 设计方案 项目内容 三维数字投影沙盘分为实体模型与虚拟影像相结合及全虚拟两种。 投影沙盘是以计算机技术为核心的现代高科技手段生成逼真的三维图像模型,借 助投影显示设备或其他显示设备把计算机上...

    数据库课程设计(5).doc

    " "物理模型设计 " "(A)将逻辑数据模型转化成物理数据模型 " "(B)对模型进行必要的完善和优化 " "(C)根据需要设计视图、存储过程和触发器等 " "(D)描述安全管理方案、备份恢复策略、并发控制策略等 " "在...

    PDMS 12.0 SP4 可用版

    提供由2D的逻辑模型到3D的实体模型直至交互式虚拟实时模型显示的整体解决方案,涵盖工厂设计的全过程。它不同于80年代占主导地位的以图形为核心的工厂设计系统,如INTERGRAPH的PDS等软件,依靠图形环境及数据库作...

Global site tag (gtag.js) - Google Analytics