《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > Oracle内嵌表及应用
Oracle内嵌表及应用
来源:微型机与应用2014年第3期
蒋 楠1,于红业1,葛利俊1,但石泉2,冯 昊3,徐 浩1等
(1.渤海石油装备承德石油机械公司,河北 承德 067000; 2.中国石油四川石化南充炼油化工总厂
摘要: 范式是关系数据库设计的理论基础,也是设计数据库中所要遵循的规则和指导方法。但在实际情况中,经常出现某条记录中某个值必须是集合类型,通常情况会建立新表,然后再通过关系来实现多值的保存。但连接查询会严重影响数据库性能。Oracle数据库中通过内嵌表实现了不符合第一范式的数据库设计,详细研究了Oracle中内嵌表的创建、查询以及修改的过程。
关键词: 软件 Oracle 内嵌表 范式
Abstract:
Key words :

摘  要: 范式是关系数据库设计的理论基础,也是设计数据库中所要遵循的规则和指导方法。但在实际情况中,经常出现某条记录中某个值必须是集合类型,通常情况会建立新表,然后再通过关系来实现多值的保存。但连接查询会严重影响数据库性能。Oracle数据库中通过内嵌表实现了不符合第一范式的数据库设计,详细研究了Oracle中内嵌表的创建、查询以及修改的过程。
关键词: Oracle;内嵌表;范式

 在关系数据库中,存在以下定义:“在任何一个关系数据库中,第一范式1NF(1 Normal Form)是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库”[1]。
 第一范式是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式中表的每一行只包含一个实例的信息。例如,对于员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
 实际情况中,却常常出现某条记录中某个值必须是集合类型(多值),通常情况会通过新建一张新表,然后再通过关系(一对一,一对多,多对多)来实现多值的保存。但是,这样也同样存在一个问题:查询速度会变慢。由于涉及不同的两个表,查询时就会涉及连接(JOIN)操作,连接操作是最为耗费资源(时间,空间)的操作,当查询量一旦增加超过某个阈值,数据库就可能会因为资源被耗尽而拒绝服务。为了减少连接操作的次数,Oracle有一种这样的特性,可以将某一列的类型设置为一个集合类型(数组—VARRAY,内嵌表—Nested Table),这样就可以在一个单元格中存放多个结构相同的数据[2-5]。
 在使用内嵌表的时候,需要先建立一个数据类型(Type),然后设置对应列的类型为之前新建的类型。建立完成后,则对应列的数据会变为表类型,对其操作需要使用table函数将其转为表后才可操作。具体实现过程如下文所述。
1 创建内嵌表类型
 (1)简单类型内嵌表,这样会创建出一个有且只有一列的内嵌表(可看作数组)
 create or replace
TYPE
  TP_ENC_TBL
AS
  TABLE OF NUMBER
(2)复杂类型内嵌表
①创建表结构
create or replace
TYPE
  TP_ENC_TYP
AS
  OBJECT(
    SN VARCHAR2(32),
    C VARCHAR2(512),
    N VARCHAR2(512)

 ②创建表类型
create or replace
TYPE
  TP_ENC_TBL
AS
  TABLE OF T_ENC_TYP
2 创建一个表,其中COL列为内嵌表类型
 CREATE TABLE
T_NESTED_TABLE(
   ID INTEGER PRIMARY KEY,
   COL TP_ENC_TBL DEFAULT TP_ENC_TBL()

NESTED TABLE
  COL
STORE AS
  NT_COL
RETURN AS VALUE;
3 查看T_NESTED_TABLE表
 desc t_nested_table
 名称 空值    类型
 ID NOT NULL NUMBER(38)
 COL          T_ENC_TBL()
 可以看出,列的类型已经是一个复杂的类型TP_ENC_TBL,至此,内嵌表新建成功。
4 对内嵌表的操作
4.1 向内嵌表列增加数据

 INSERT INTO
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)
VALUES
(′val′,′val′,′val′)
首先必须选择向内嵌表插入数据,由于表是内嵌的,所以必须先从某个单元格中将内嵌表选择出来,然后使用table函数进行转换。
4.2 修改内嵌表中的数据
 UPDATE
 TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
 SET
 t.sn=′new_val′,
 t.c=′new_val′,
 t.n=′new_val′
 首先必须选择需要修改的内嵌表,由于表是内嵌的,所以必须先从某个单元格中将内嵌表选择出来,然后使用table函数进行转换。
4.3 查询内嵌表中的数据
 SELECT
t.*
FROM
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
SN         C          N
new_val     new_val    new_val
4.4 删除内嵌表中的数据
DELETE FROM
TABLE(SELECT nt.col FROM t_nested_table nt WHERE nt.ID=1)t
WHERE
t.SN=′new_val′
 嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。通过嵌套表,在不影响数据库性能的情况下,通过Oracle实现不遵循范式的存储。
参考文献
[1] 王珊,萨师煊.数据库系统概论.第四版[M].北京:高等教育出版社,2006.
[2] THOMAS KYTE(美).Oracle高级专家编程[M].美国加州:Wrox Press,2001.
[3] 吴孝丽,周焱,耿惊涛.ORACLE数据库安全策略和方法[J].煤炭技术,2011,30(5):113-115.
[4] 俞盘祥.Oracle数据库系统基础[M].北京:清华大学出版社,1995.
[5] 余以胜.Oracle数据库备份解决方案的研究[J].计算机与数字工程,2006,34(1):118-121.

此内容为AET网站原创,未经授权禁止转载。