- 浏览: 459305 次
文章分类
最新评论
-
datawarehouse:
来学习了。
什么是informatic? -
nange223:
感谢分享,学习了
一些数据库监控,优化,管理工具 -
pianxibin:
ertrth thr dj dyj
一些数据库监控,优化,管理工具 -
gekky6:
多谢分享,学习下
一些数据库监控,优化,管理工具 -
lqlein:
好好学习学习
一些数据库监控,优化,管理工具
自己整理了一下
一、嵌套表的定义:
嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。在一个严格的关系模型中,将需要建立两个独立的表department和project.
嵌套表允许在department表中存放关于项目的信息。勿需执行联合操作,就可以通过department表直接访问项目表中的记录。这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。
二、转一下别人的东西
浅析oracle嵌套表
2008-03-05 18:24
以前在做报表的时候会经常用到oracle的内存表(其实是oracle嵌套表的部分功能,这里在下边介绍)来提高性能。
利用oracle内存表进行临时运算通过ref cursor来返回我们想要的结果集。 open cur for select * from table(fun_to_table_rb1_1(cur_qc,cur_qm)); 关于这部分的一些测试可以参看:http://www.itpub.net/showthread.php?threadid=617298 最近把oracle嵌套表的其他功能仔细看了看并做了个简单整理。 oracle提供两种使用嵌套表的方法: 1. PL/SQL代码中作为扩展PL/SQL语言;(这部分内容就是上边所说oracle内存表是oracle嵌套表的部分功能) 2. 作为物理存储机制,以持久地存储集合。 */ --创建测试表: CREATE TABLE dept (deptno NUMBER(2) PRIMARY KEY, dname VARCHAR2(14), loc VARCHAR2(13) ); CREATE TABLE emp (empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4) REFERENCES emp, hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) REFERENCES dept ); INSERT INTO dept SELECT * FROM scott.dept; INSERT INTO emp SELECT * FROM scott.emp; --创建type CREATE OR REPLACE TYPE emp_type AS OBJECT (empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2) ); CREATE OR REPLACE TYPE emp_tab_type AS TABLE OF emp_type; --使用嵌套表 CREATE TABLE dept_and_emp (deptno NUMBER(2) PRIMARY KEY, dname VARCHAR2(14), loc VARCHAR2(13), emps emp_tab_type ) NESTED TABLE emps STORE AS emps_nest; --可以在嵌套表上增加约束(这里我们先不执行此步骤,等做完下一步测试我们再创建约束) --ALTER TABLE emps_nt ADD CONSTRAINT emps_empno_unique --嵌套表不支持参照完整性约束,不能参考任何其他表甚至自己 --给嵌套表增加数据,我们看看这两种方式的结果有何不同 方式1:INSERT INTO dept_and_emp SELECT dept.*, CAST( MULTISET( SELECT empno, ename, job, mgr, hiredate, sal, comm FROM emp WHERE emp.deptno = dept.deptno ) AS emp_tab_type ) FROM dept; --Oracle同样提供方法去掉集合的嵌套,像关系型表一样处理(能够将EMPS列当作一个表,并自然连接且不需要连接条件): SELECT d.deptno, d.dname, emp.* FROM dept_and_emp D, TABLE(d.emps) emp; --这里执行看到结果是14条数据 delete from dept_and_emp; 方式2:INSERT INTO dept_and_emp SELECT dept.*, CAST(MULTISET( SELECT empno, ename, job, mgr, hiredate, sal, comm FROM emp,dept WHERE emp.deptno = dept.deptno ) AS emp_tab_type ) from dept; SELECT d.deptno, d.dname, emp.* FROM dept_and_emp D, TABLE(d.emps) emp; --这里执行看到结果是56条数据,显然是错误的 --第一个是按照where等连接条件符合的某一个dept的emp表的数据作为一个集合存储,而第二个没有任何关联条件,就是把所有emp的数据 --全部作为一个dept的数据存储,这个写法显然是错误的,如果我们把刚才讲的约束给嵌套表加上,就可以起到防止这种错误的功效了。 --增加约束再执行我们上边的第二个insert语句将会报错 --我们按照上边第一个insert语句插入数据,继续我们下边的测试。 --按照“每行实际是一张表”的思想来更新: UPDATE TABLE( SELECT emps FROM dept_and_emp WHERE deptno = 10) SET comm = 100; --插入与删除的语法: INSERT INTO TABLE(SELECT emps FROM dept_and_emp WHERE deptno=10) VALUES (1234,'NewEmp','Clerk',7782,SYSDATE,1200,NULL); DELETE FROM TABLE(SELECT emps FROM dept_and_emp WHERE deptno=20) WHERE ename='SCOTT'; --一般而言,必须总是连接,而不能单独查询嵌套表(如emp_nest)中的数据,但是如果确实需要,是可以的。 --hint NESTED_TABLE_GET_REFS被用于EXP和IMP处理嵌套表。 SELECT /*+NESTED_TABLE_GET_REFS+*/ NESTED_TABLE_ID, SYS_NC_ROWINFO$ FROM emps_nest; --而察看EMPS_NEST的结构看不到NESTED_TABLE_ID,SYS_NC_ROWINFO$两列。对父表DEPT_AND_EMP来说NESTED_TABLE_ID是一个外键。 --使用这个hint就可以直接操作嵌套表了: UPDATE /*+NESTED_TABLE_GET_REFS+*/ emps_nest SET ename=INITCAP(ename); --嵌套表的存储: --上例中,现实产生了两张表: /* DEPT_AND_EMP (deptnob NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), SYS_NC0000400005$, RAW(16)) EMPS_NEST (SYS_NC_ROWINFO$, NESTED_TABLE_ID, RAW(16), empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2)) */ --默认情况下,每个嵌套表列都产生一个额外的RAW(16)隐藏列,并在其上创建了唯一约束,用以指向嵌套表。而嵌套表中有两个 --隐藏列:SYS_NC_ROWINFO$是作为一个对象返回所有标量元素的一个伪列;另一个NESTED_TABLE_ID的外键回指向父表。 --可以看到真实代码: /* CREATE TABLE DEPT_AND_EMP (DEPTNO NUMBER(2,0), DNAME VARCHAR2(14), LOC VARCHAR2(13), EMPS EMP_TAB_TYPE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1 BUFFER_POOL DEFAULT) TABLESPACE USER NESTED TABLE EMPS STORE AS EMPS_NEST RETURN BY VALUE; RETURN BY VALUE用来描述嵌套表如何返回到客户应用程序中。 NESTED_TABLE_ID列必须是索引的,那么较好的解决办法就是使用IOT存储嵌套表。 CREATE TABLE DEPT_AND_EMP (DEPTNO NUMBER(2,0), DNAME VARCHAR2(14), LOC VARCHAR2(13), EMPS EMP_TAB_TYPE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1 BUFFER_POOL DEFAULT) TABLESPACE USER NESTED TABLE EMPS STORE AS EMPS_NEST ((empno NOT NULL, UNIQUE(empno), PRIMARY KEY(nested_table_id,empno)) ORGANIZATION INDEX COMPRESS 1) RETURN BY VALUE; 这样与最初默认的嵌套表相比,使用了较少的存储空间并有最需要的索引。 不使用嵌套表作为永久存储机制的原因 1.增加了RAW(16)列的额外开销,父表和子表都将增加这个额外的列; 2.当通常已经有唯一约束时,父表上的唯一约束是额外开销; 3.没有使用不支持的结构(NESTED_TABLE_GET_REFS),嵌套表不容易使用。 一般推荐在编程结构和视图中使用嵌套表。如果要使用嵌套表作为存储机制, 确保嵌套表是IOT,以避免NESTED_TABLE_ID和嵌套表本身中索引的额外开销 |
发表评论
-
oracle分析函数row_number() over()使用
2009-12-24 16:00 2297row_number() over ([partition ... -
深入sql之merge into
2009-07-10 22:37 2185http://nodonkey.iteye.com/blog/ ... -
Oracle字符集问题总结(转)
2009-07-10 15:53 992经常有同事咨询oracle数据库字符集相关的问题,如在不 ... -
minus/not in/not exists的原理和效率
2009-07-06 14:57 2935http://www.itpub.net/viewthread ... -
批量获取多个表的创建索引语句
2009-06-08 09:48 1557批量获取多个表的创建索引语句 一个朋友提供的set ec ... -
Truncate table,Delete,与Drop table的区别
2009-06-06 15:33 4491TRUNCATE TABLE 在功能上与不带 WHERE 子句 ... -
oracle cast() 函数问题
2009-06-02 15:03 12951SQL> create table t1(a varch ... -
db2中decimal实现oracle中trunc的方法
2009-06-02 15:00 3221在oracle中trunc的使用方法: 1.TRUNC(fo ... -
oracle是如何工作的(一个有趣的故事)
2009-06-01 14:12 1142转自http://bbs3.chinaunix.net/v ... -
表约束的巧用
2009-06-01 14:08 7551、问题: 表中的一個欄位,現在是VARCHAR2(8)型的 ... -
BLOB和CLOB区别和定义
2009-06-01 11:16 10138BLOB和CLOB区别和定义 LON ... -
Oracle中忘记System和Sys密码后的处理方法
2009-05-06 21:21 1328Oracle提供两种验证方式,一种是OS验证,另一种密码文件验 ... -
Oracle SQL*Loader 使用指南(解决插入大量的数据)
2009-04-27 11:21 1559我的理解; 如果表的属性是NOLOGG ... -
数据字典——数据库概念
2009-04-24 09:37 1465来自:http://yangtingkun.itpub.net ... -
创建连接服务器
2009-03-30 10:53 819一般的方法是:oracle->Net manager 还 ... -
JIRA
2009-03-13 13:57 1106在cmcs學到的系統JIRA+SVN+Fisheye+Cruc ... -
Study Oracle Document Website
2009-03-12 09:32 1129http://www.siue.edu/~dbock/cmis ... -
查看表占用多少M
2009-03-03 13:40 844SQL> SELECT d.status "S ... -
汉字和字符分开(整理)--补充(所用函数说明)
2009-03-02 17:17 18601、substr() substr('This is ... -
汉字和字符分开(整理)
2009-03-02 17:11 1181SQL> create table gjtext 2 ...
相关推荐
Oracle嵌套表使用和存储分析.doc
4. 使用JAVA存储过程(通过POI包,这也是本文的重点) 4.1至http://poi.apache.org 下载POI包,注意与ORACLE JVM版本匹配 ...至ORACL官网下载JDBC驱动,这一步不是必须的, ...目录为:$ORACLE_HOME/javavm/lib ,
Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考
基于ADO接口技术的Oracle数据库嵌套表的开发研究.pdf
MLDN魔乐科技_Oracle课堂24_嵌套表、可变数组
MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组.rar
教程名称:Oracle使用疑难问题汇总课程目录:【】Oracle DBA优化数据库性能心得体会【】ORACLE 中ROWNUM用法总结【】Oracle 查询表空间使用情况(经典篇)【】Oracle下巧用bulk collect实现cursor批量fetch【】...
内连接 自然连接 左外连接 右外连接 笛卡尔连接 索引连接 嵌套连接
第34章 收集器(嵌套表和可变数组) 第35章 使用大对象 第36章 面向对象的高级概念 第Ⅶ部分 Oracle中的Java 第37章 Java简介 第38章 JDBC程序设计 第39章 Java存储过程 第40章 Oracle真正应用群集 第41章 网格体系...
主要介绍了oracle中变长数组varray,嵌套表,集合使用方法,需要的朋友可以参考下
通过实例介绍了 cast(multiset() as) 的使用方法,以处理嵌套表的操作
Oracle BI Publisher introduction Word Template 布局编辑,报表格式设置。
主要包括各种类型的表创建以及适用情形,如外部表、分区表、嵌套表、全局临时表等;完整性约束的管理;索引,包括B树索引、基于函数的索引、位图索引、反向索引、降序索引、压缩索引等的使用方法及其适用情形等。在...
oracle10g 脚本,免费的。我们学习oracle10g的一些代码。分区表,嵌套表,触发器的代码,希望共享。。。
Oracle 10g 中针对 SQL Server 2003 新添加了一系列支持 Advanced Multiset 的运算符,他们可以用于对 Oracle 数据库中的嵌套表进行处理。本文举例介绍了这些新函数的使用方法。
·定义和部署varray 、嵌套表和联合数组数据类型; ·处理外部例程、对象类型、大对象和安全文件; ·使用DBMS_ALERT 和DBMS_PIPE 在并行会话间通信; ·通过Oracle Net Services 和PL/SQL 包装器调用外部...
可变数组与嵌套表相似,也是一种集合。一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。从概念上讲,可变数...
嘉兴IBM培训Oracle课件 ORACLE01SQL建表与查询 ORACLE02连接与子查询 ORACLE03DCL,TCL ORACLE04数据库对象 ORACLE05PLSQL编程基础 ORACLE06游标 ORACLE07记录类型与PLSQL表 ...ORACLE12可变数组和嵌套表
而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和 嵌套表等,还是无法查到。从数据字典中获得DDL语句是经常要用的,特别是在系统升级/重建的时候。在 Oracle 9i中,我们可以直接通过...