Oracle面向对象的应用实例

近期做项目,遇到一个基站的数据模型,此基站有7大属性,每个属性下面又有第二层的若干个属性,第二层下面又有第三层的若干属性,一直到第五层的最底层属性超过1000个,现在要把这个基站按照7大属性,设计成7个表,每个属性的最底层属性从100到400多不等。

如何设计呢?

第一、最常见的用每个属性的最底层属性来建表,最大的一个表超过400个字段,这样从性能到维护都是不行的。

第二、按照事实表与纬度表的关系来设计,把每个大属性分为若个小属性来设计表,结果可能是得到几十个表,相互之间还有复杂的逻辑关系,在业务处理上不方便。

第三、按照Oracle面向对象的设计方法,以第三层为准设计对象,就是把每个大属性下面的第三层属性设计为每个对象,然后再用对象来定义表。

原数据模型太复杂了,就不举例了,下面用一个简单的例子来说明下。

例如常见的员工表,有这些字段(eid、ename、sex、borthady、address、phone、job、dept、manager、sal、subsidy、tax、school、grad、educa、degree、extcol、extcol2、extcol3、、、)

按照字段的类别设计为下面的几个类:

--员工基本类

create or replace type ty_person as object

(ename     varchar2(20),--姓名

sex       char(1),     --性别

borthady  date,        --生日

address   varchar2(20),--地址

phone     varchar2(20) --电话

);

--工作基本类

create or replace type ty_job as object

(job      varchar2(20),   --职位

dept     varchar2(20),   --部门

manager  varchar2(20)    --经理

);

--工资基本类

create or replace type ty_sal as object

(sal      number,  --工资

subsidy  number,  --补贴

tax      number   --税费

);

--教育基本类

create or replace type ty_edu as object

(school varchar2(20),  --毕业学校

grad   date,          --毕业时间

educa  varchar2(20),  -- 学历

degree  varchar2(20), --学位

);

--使用上面的类来构造员工表

create table t_emp

(eid     varchar2(20) not null,

person  ty_person,

job     ty_job,

sal     ty_sal,

edu     ty_edu,

extcol   varchar2(50),

extcol2  varchar2(50),

extcol3  varchar2(50),

extcol4  varchar2(50),

extcol5  varchar2(50)

);

--extcol 表示扩展字段

下面介绍类的基本操作:

1.使用构造函数加入数据

insert into t_emp(eid , person,job,sal,edu ,extcol,extcol2,extcol3 ,extcol4,extcol5)

values(‘001‘,

ty_person(‘scott‘,‘M‘,to_date(‘1981-10-10‘,‘yyyy-mm-dd‘),‘beijing‘,‘0102345678‘),

ty_job(‘DBA‘,‘IT‘,‘smith‘),

ty_sal(8000,1000,500),

ty_edu(‘Peking University‘,to_date(‘2004-10-10‘,‘yyyy-mm-dd‘),‘bachelor‘,‘bachelor‘),

null,null,null,null,null);

2.查询数据

select * from t_emp t;

select VALUE(t) from emp  t;

--查某个类的数据

select t.ty_person.name,t.ty_person.sex,t.ty_person.borthady,t.ty_person.address,t.ty_person.phone

from t_emp t;

3.删除数据

delete t_emp t where  t.ty_person.name=‘scott‘;

4.修改数据

update  t_emp t set t.ty_person.name=‘Mark‘

where t.ty_person.name=‘scott‘;

UPDATE emp  e

SET e.person = ty_person(‘mark‘,‘M‘,to_date(‘1982-10-10‘,‘yyyy-mm-dd‘),‘neijing‘,‘0212345678‘)

WHERE e.eid = ‘001‘;

基本的操作就是这些,更多的面向对象操作请查看Oracle文档。

时间: 2024-11-19 19:26:13

Oracle面向对象的应用实例的相关文章

Oracle之索引(Index)实例讲解 - 基础

Oracle之索引(Index)实例讲解 - 基础 索引(Index)是关系数据库中用于存放表中每一条记录位置的一种对象,主要目的是加快数据的读取速度和数据的完整性检查.索引的建立是一项技术性要求非常高的工作. 一般在数据库设计阶段就要考虑到如何设计和创建索引. 1. 创建索引 创建索引的语法: CREATE [UNIQUE] INDEX [schema.] index ON [schema.] table (column [ASC | DESC], column [ASC | DESC]...

[转]Oracle DB 管理ASM实例

? 描述使用ASM 的好处 ? 管理ASM 实例 ? 创建和删除ASM 磁盘组 ? 扩展ASM 磁盘组 ? 通过使用各种实用程序检索ASM 元数据 Automatic Storage Management Automatic Storage Management (ASM) 将文件系统与卷管理器纵向集成在一起,这是一项专门为Oracle DB 文件建立的技术.使用ASM 可管理单个对称多处理(SMP) 计算机,或通过管理集群的多个节点来支持Oracle Real Application Clus

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

连接 Oracle 11G R2 ASM实例

连接 Oracle 11G R2 ASM实例 开始连接ASM时候,效仿10G的方法却怎么都连接不到ASM 连接的都是idle实例 [[email protected] ~]# su - oracle [[email protected] ~]$ export ORACLE_SID=+ASM2 [[email protected] ~]$ sqlplus   / as  sysdba SQL*Plus: Release 11.2.0.3.0 Production on Wed May 16 18:

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------

今天给大家分享一个oracle问题的解决实例

今天给大家分享一个oracle问题的解决实例 如启动Oracle时提示"ORA-00600: internal error code, arguments"错误? SQL> startup ORA-00600: internal error code, arguments: [ksunfy : too few sessions], [9504], [75040], [], [], [], [], [], [], [], [], []" 解决办法:这里的错误说明Oracl

Oracle 10g高级复制实例(多主体复制)(转载)

Oracle 10g高级复制实例(多主体复制) 前言: 配置了三次,两次都是单向.最后一次终于是双向的了.也算一点有点成功的喜悦.喜悦?喜悦确实谈不上.这么简单的东西弄了这么久觉得惭愧.网络上的资料一大堆.不过他们写的好象都有些随意.有的时候一点点错误可以使你只有重来.我现在重新写一次.只提供给初学者.配置的高手的就不要开腔了.因为实在不好意思拿出来见人. 信息: 主体定义数据库:testdb.geong.com(弄清楚别弄错了.) 主体数据库:backdb.geong.com 操作系统:  x

Oracle 数据库名、实例名、Oracle_SID

本文参考自ORACLE 数据库名.实例名.ORACLE_SID的区别,纯属读书笔记,加深记忆 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instance_name).在ORACLE8i.9i中出现了新的参数,即数据库域名(db_domain).服务名(service_name).以及操作系统环境变量(ORACLE_SID).这些都存在于同一个数据库中的标识,用于区分不同数据库的参数. 1.数据库名 数据库名是用于区分数据的标识,是以二进制形式存储于数据库控制文件中

oracle下的数据库实例、表空间、用户及其表的区分

oracle数据库组成: 由oracle数据库和数据库实例两部分组成: 数据库是指一系列数据文件的集合,数据库实例则是oracle后台进程/线程以及在服务器分配的共享内存区: 查询当前数据库名 1 SQL> select name from v$database; 2 3 NAME 4 --------- 5 ORCL 查询当前数据库实例名 数据库实例名(instance_name)用于对外部连接.在操作系统中要取得与数据库的联系,必须使用数据库实例名.比如我们作开发,要连接数据库,就得连接数据