- 浏览: 470598 次
文章分类
最新评论
-
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 2352row_number() over ([partition ... -
深入sql之merge into
2009-07-10 22:37 2237http://nodonkey.iteye.com/blog/ ... -
Oracle字符集问题总结(转)
2009-07-10 15:53 1091经常有同事咨询oracle数据库字符集相关的问题,如在不 ... -
minus/not in/not exists的原理和效率
2009-07-06 14:57 2994http://www.itpub.net/viewthread ... -
批量获取多个表的创建索引语句
2009-06-08 09:48 1605批量获取多个表的创建索引语句 一个朋友提供的set ec ... -
Truncate table,Delete,与Drop table的区别
2009-06-06 15:33 4576TRUNCATE TABLE 在功能上与不带 WHERE 子句 ... -
oracle cast() 函数问题
2009-06-02 15:03 12995SQL> create table t1(a varch ... -
db2中decimal实现oracle中trunc的方法
2009-06-02 15:00 3286在oracle中trunc的使用方法: 1.TRUNC(fo ... -
oracle是如何工作的(一个有趣的故事)
2009-06-01 14:12 1204转自http://bbs3.chinaunix.net/v ... -
表约束的巧用
2009-06-01 14:08 8061、问题: 表中的一個欄位,現在是VARCHAR2(8)型的 ... -
BLOB和CLOB区别和定义
2009-06-01 11:16 10223BLOB和CLOB区别和定义 LON ... -
Oracle中忘记System和Sys密码后的处理方法
2009-05-06 21:21 1364Oracle提供两种验证方式,一种是OS验证,另一种密码文件验 ... -
Oracle SQL*Loader 使用指南(解决插入大量的数据)
2009-04-27 11:21 1611我的理解; 如果表的属性是NOLOGG ... -
数据字典——数据库概念
2009-04-24 09:37 1524来自:http://yangtingkun.itpub.net ... -
创建连接服务器
2009-03-30 10:53 866一般的方法是:oracle->Net manager 还 ... -
JIRA
2009-03-13 13:57 1152在cmcs學到的系統JIRA+SVN+Fisheye+Cruc ... -
Study Oracle Document Website
2009-03-12 09:32 1182http://www.siue.edu/~dbock/cmis ... -
查看表占用多少M
2009-03-03 13:40 897SQL> SELECT d.status "S ... -
汉字和字符分开(整理)--补充(所用函数说明)
2009-03-02 17:17 19131、substr() substr('This is ... -
汉字和字符分开(整理)
2009-03-02 17:11 1234SQL> create table gjtext 2 ...
相关推荐
Oracle嵌套表使用和存储分析.doc
Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考
4. 使用JAVA存储过程(通过POI包,这也是本文的重点) 4.1至http://poi.apache.org 下载POI包,注意与ORACLE JVM版本匹配 ...至ORACL官网下载JDBC驱动,这一步不是必须的, ...目录为:$ORACLE_HOME/javavm/lib ,
在本文中,研究了基于ADO接口技术的Oracle数据库嵌套表的开发过程,特别是涉及到的ADO技术、VC平台下的数据库嵌套表的开发,以及使用ParameterPtr接口对象在其中的作用。为了更全面地理解这一研究,我们首先需要掌握...
在Oracle数据库系统中,嵌套表和可变数组是两种重要的高级数据类型,它们提供了处理复杂数据结构的能力,尤其在存储和操作集合类数据时显得非常有用。在本Oracle课堂中,我们将深入探讨这两个概念以及它们在实际应用...
在SQL中,集合嵌套表(Collection Nested Table)和VARRAY(Variable Array)是两种用于存储复杂数据结构的数据类型,特别是在处理多值列或者数组类型数据时非常有用。本篇文章将详细探讨这两种数据类型,以及它们在...
本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂数据时非常有用。 嵌套表,也称为集合类型,允许在一个列中存储多个...
Oracle 数据完整性嵌套事务调用分析研究 Oracle 数据库中,数据完整性是指数据的正确性、完整性和一致性。为了保护数据的完整性,我们可以使用多种方法,例如数据表的主键约束、外键约束、触发器等等。在处理数据...
38. **NESTED**: 是否嵌套表。 39. **BUFFER_POOL**: 缓冲池。 40. **ROW_MOVEMENT**: 行移动。 41. **GLOBAL_STATS**: 全局统计信息。 42. **USER_STATS**: 用户统计信息。 43. **DURATION**: 持续时间。 44. **...
本示例“Oracle Nested Table Demo”将向我们展示如何在Oracle数据库中创建、操作和使用嵌套表。 嵌套表的定义: 在Oracle中,嵌套表是由单个行组成的数据集合,这些行可以包含相同或不同的列。与传统的表不同,...
本文将对Oracle中的几种主要表连接方式进行详细介绍:内连接(Inner Join)、自然连接(Natural Join)、左外连接(Left Outer Join)、右外连接(Right Outer Join)、笛卡尔连接(Cartesian Join)、索引连接...
1. **第一层嵌套**:实现基本的查询逻辑,获取原始数据集,可能包含多个表的连接或复杂的WHERE条件。 2. **第二层嵌套**:在此基础上添加ORDER BY子句进行排序,并使用ROWNUM伪列,但为了避免ROWNUM的优先级高于...
Oracle 数据库中的表连接是构建复杂 SQL 查询的基础,它允许从多个表中组合数据。连接方法的选择直接影响到查询性能,因此了解各种连接类型及其适用场景至关重要。本文将深入探讨 Oracle 中的三种主要连接方式:嵌套...
教程名称:Oracle使用疑难问题汇总课程目录:【】Oracle DBA优化数据库性能心得体会【】ORACLE 中ROWNUM用法总结【】Oracle 查询表空间使用情况(经典篇)【】Oracle下巧用bulk collect实现cursor批量fetch【】...
Oracle会选择一个表作为驱动表,遍历其每一行并与另一个表逐行比较,生成结果集。嵌套循环连接在获取初始结果集时速度快,但对大规模数据处理效率低。 2. 群集连接 (CLUSTER JOIN):在早期版本的Oracle中,群集连接...
嵌套表是指将一个表嵌套在另一个表中的表类型,用于存储复杂的关系数据。 4.8 其他表 除了上述表类型外,还有其他一些特殊的表类型,如外部表、临时表等。 掌握各种类型的表的创建方法,了解常规表、分区表、索引...
ORACLE 表的物理组织形式包括堆表、索引组织表、分区表、对象表、嵌套表等。 * 堆表(Normal Table):最基本的表类型,数据存储在堆中。 * 索引组织表(Index Organized Table):索引组织表是基于索引的表类型,...
在Oracle数据库中,变长数组(VARRAY)和嵌套表是两种集合类型,它们用于存储一组相关的数据。本文将详细介绍这两种数据结构的创建、使用、修改和查询方法。 首先,我们来看变长数组(VARRAY)。变长数组是一种限制...
### Oracle数据库三种主要表连接方式对比 在Oracle数据库中,为了获取来自多个表的数据,我们需要使用不同的连接方式来实现这一目的。本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL...
Oracle支持三种主要的集合类型:关联数组、嵌套表和VARRAY。 - 可以在程序的声明部分使用`TYPE`关键字定义特定的集合类型,然后创建该类型的变量实例。 **集合或集合实例** - “集合”可以指代PL/SQL变量,如关联...