- 浏览: 520848 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (299)
- Oracle(pl/sql_Erp_Pro*C) (69)
- 设计模式 (4)
- spring (23)
- ext (17)
- apache开源项目应用 (4)
- jquery (16)
- 生活琐事 (8)
- 下载资源 (23)
- mysql (2)
- Eclipse使用积累 (5)
- 报表类(报表/图表) (13)
- php (4)
- Web多彩文本框 (3)
- json (4)
- jqgrid (2)
- ant (2)
- java算法积累 (8)
- EL表达式/JSTL (4)
- poi (3)
- gwt (2)
- 爬网第一步 (2)
- javascript (17)
- Javaweb (8)
- tomcat (1)
- flex (1)
- Java&DB (3)
- J2SE (7)
- linux (3)
- 数据结构 (1)
- dot net (5)
- struts (1)
- ibatis (1)
- log4j (1)
- 项目管理 (1)
- Java native interface(jni,jacob......) (5)
- applet (1)
- VB.net/C#.net/JNI (20)
- css (1)
- Sqlite (1)
- servlet (1)
- REST (1)
最新评论
-
wenhurena:
能不能给一下解压密码roki.work.2017@gmail. ...
Ebs解体新書と学習資料1 -
liutao1600:
楼主写的太好了,每天学习~~
Spring_MVC(6)测试 -
liutao1600:
太好了,每天学习你的文章~~~
Spring_MVC(3)表单页面处理 -
liutao1600:
学习了,太好了
Spring_MVC(2)控制层处理 -
liutao1600:
学习了~~~
Spring_MVC(1)构建简单web应用
一、嵌套表的定义:
嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。在一个严格的关系模型中,将需要建立两个独立的表department和project.
嵌套表允许在department表中存放关于项目的信息。勿需执行联合操作,就可以通过department表直接访问项目表中的记录。这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。
二、浅析oracle嵌套表
以前在做报表的时候会经常用到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和嵌套表本身中索引的额外开销
三、补充
1、cast:强制转换成指定的数据类型。
2、multiset:转换成定义好的类型。
3、 table()函数
参考http://www.itpub.net/showthread.php?threadid=617298
PL/SQL表---table()函数用法
/*
PL/SQL表---table()函数用法:
利用table()函数,我们可以将PL/SQL返回的结果集代替table。
simple example:
1、table()结合数组:
*/
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);
create or replace type t_test_table as table of t_test;
create or replace function f_test_array(n in number default null) return t_test_table
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend(); -- append one null element
-- 为增加的元素赋值,如果没用EXTEND,这里会出错
v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
end loop;
return v_test;
end f_test_array;
/
select * from table(f_test_array(10));
/*
2、table()结合PIPELINED函数:
*/
create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
pipe row(t_test(i,sysdate,'mc'||i));
end loop;
return;
end f_test_pipe;
/
select * from table(f_test_pipe(20));
/*
3、table()结合系统包:
*/
create table test (id varchar2(20));
insert into test values('1');
commit;
explain plan for select * from test;
select * from table(dbms_xplan.display);
4、上述所用函数解释
extend(): Oracle 在逻辑上是由各个表空间(tablespace)构成的,
tablespace由segments(段)构成
段是由extends构成 中文叫作区 或者数据区
区是由一个一个的数据块构成 数据块的大小由操作系统决定。
PIPELINED pipe row:
参考 http://edu.cnzz.cn/NewsInfo/15746.aspx
Pipelined Table实现split函数的示例
split作用: 比如说把一个字符串A,B,C,D,E 根据逗号分隔,转换成一个数组,数组中的每个元素是
A
B
C
D
E
在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。
Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。
发表评论
-
IBatis调用ORACLE的存储过程、函数的返回结果集例子
2012-03-05 23:31 2136import java.io.Serializabl ... -
Oracle分页函数样例——用于提高当前框架分页性能
2012-03-05 23:27 1391create or replace procedure P ... -
Oracle入门课件
2011-12-11 22:43 1016下载附件 -
自己经常上的Oracle官网的一些链接~~是啥自己点开看
2011-11-17 23:27 1120http://www.oracle.com/pls/db ... -
Oracle性能诊断艺术源码
2011-08-16 00:51 881请下载。 -
oracle support
2011-06-23 16:34 926https://support.oracle.com/CSP/ ... -
oracle 11g sql code
2011-02-24 20:55 1118附件参考 -
Oracle SQL优化
2011-01-19 23:16 879详见附件。讲述优化器。 -
Oracle PGA概念及调整
2011-01-03 23:18 1751--预备知识PGA(Process Global Area), ... -
修改Oracle SGA——防止oracle内存分配不足而down机
2011-01-03 23:16 2346在安装oracle 10g r2 数据库时,默认的SGA大 ... -
oracle SGA
2011-01-03 23:14 1366系统全局区又称SGA (System Global A ... -
Oracle 高水位概念(hwm)
2010-12-22 22:09 1441说到HWM,我们首先要简要 ... -
CDC积累的plsql用的各种例子
2010-11-09 15:49 842自用,有密码!请勿浪费时间下载。 -
oracle Erp安装和具体财务模块介绍
2010-10-11 12:54 1185http://bbs.erp100.com/thread-20 ... -
Oracle察看表约束
2010-10-08 16:07 11091、我们创建的对象可以从"USER_"开通 ... -
Oracle 行列转换积累
2010-09-29 11:36 1709行列转换包括以下六种情况:*列转行*行转列*多列转换成字符串 ... -
oracle bulk collection
2010-09-14 18:26 1262Oracle Bulk Collection & ... -
oracle discover
2010-09-03 16:28 964oracle discover -
Oracle rawtohex hextoraw
2010-09-03 15:03 3196Oracle 8.1.7 SQL> ed ... -
Oracle Raw,number,varchar2转换
2010-09-03 14:56 2266Oracle Raw,number,varchar2...转换 ...
相关推荐
在SQL中,集合嵌套表(Collection Nested Table)和VARRAY(Variable Array)是两种用于存储复杂数据结构的数据类型,特别是在处理多值列或者数组类型数据时非常有用。本篇文章将详细探讨这两种数据类型,以及它们在...
Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考
**嵌套表集合** **--索引表集合** ``` declare type 集合类型名 is table of 元素类型 index by 下标类型; 变量名集合类型名 begin 集合类型名(唯一下标):=元素; end; --嵌套表集合 declare type 嵌套...
本示例"XE2三层主从嵌套表批量更新源码demo"聚焦于使用Delphi XE2进行数据库管理,特别是针对主从表和嵌套表的批量更新。这种场景常见于数据结构复杂的业务系统,例如订单管理、库存控制等,其中主表记录基本信息,...
本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂数据时非常有用。 嵌套表,也称为集合类型,允许在一个列中存储多个...
在Oracle数据库系统中,嵌套表和可变数组是两种重要的高级数据类型,它们提供了处理复杂数据结构的能力,尤其在存储和操作集合类数据时显得非常有用。在本Oracle课堂中,我们将深入探讨这两个概念以及它们在实际应用...
在本文中,研究了基于ADO接口技术的Oracle数据库嵌套表的开发过程,特别是涉及到的ADO技术、VC平台下的数据库嵌套表的开发,以及使用ParameterPtr接口对象在其中的作用。为了更全面地理解这一研究,我们首先需要掌握...
4. 使用JAVA存储过程(通过POI包,这也是本文的重点) ...至ORACL官网下载JDBC驱动,这一步不是必须的, 一般安装ORACLE时,都有内置了JDBC包。 ...4.2.1先将POI包上传至ORACLE服务器。目录为:$ORACLE_HOME/javavm/lib ...
Oracle嵌套表使用和存储分析.doc
在Oracle数据库中,变长数组(VARRAY)和嵌套表是两种集合类型,它们用于存储一组相关的数据。本文将详细介绍这两种数据结构的创建、使用、修改和查询方法。 首先,我们来看变长数组(VARRAY)。变长数组是一种限制...
"Only-Table:简单创建表和嵌套表"这个主题聚焦于如何利用HTML来构建表格以及嵌套表格,这对于网页设计和数据展示至关重要。下面我们将深入探讨HTML表格的创建方法以及嵌套表格的概念。 首先,创建一个基本的HTML...
在本教程中,我们将探讨如何在Symfony框架中实现一个具有嵌套评论功能的系统,其中评论可以有父评论(即回复)以及多个子评论。这是一个典型的自引用多对一关系,意味着每个评论对象都可以有一个父评论(多对一),...
2007开始)的库,其中包含占位符和嵌套表。 数据模型与生成的文档格式无关。 该库并不是要从头开始创建文档,而是要与包含占位符的模板,具有占位符的表以及嵌套的子表(包含表的表)一起使用。 通过使用抽象模型层...
它支持多种高级数据结构,其中就包括嵌套表(Nested Table)。嵌套表是一种特殊类型的集合类型,允许在一个列中存储一组行,这些行可以是同一种类型的数据。本示例“Oracle Nested Table Demo”将向我们展示如何在...
KnockoutJS Nested DataTable是一个 KnockoutJS 自定义组件,易于使用、自定义元素、嵌套表和可扩展。 所有默认的 dataTable 功能,如排序、分页、搜索等,也适用于该组件。 当前版本 0.1.0 入门 可选:要与凉亭一起...
Oracle 10g是Oracle数据库的一个重要版本,其在PL/SQL编程方面提供了丰富的特性,如PL/SQL表和记录、嵌套表以及可变数组等。这些特性极大地增强了数据库处理和应用程序开发的能力。 PL/SQL表是PL/SQL块内的一种临时...
"IOS表格嵌套加设置字体颜色大小"这个主题涉及到UITableView的高级用法,包括如何在表格单元格中嵌套视图以及自定义字体的颜色和大小。这种技术可以提升用户体验,使信息层次更清晰,更易于阅读。 首先,`...
本文将详细介绍PL/SQL中的三种主要集合类型:Index_by表、嵌套表和VARRAY,并讨论如何在实际应用中使用这些集合。 #### 二、集合类型 ##### 1. Index_by表(联合数组) **定义** Index_by表是一种特殊的PL/SQL...
- “集合”可以指代PL/SQL变量,如关联数组、嵌套表或VARRAY类型,也可以指数据库表中的列。 - 集合的核心是一维列表,其中包含同质元素。 **同质元素** - 集合中的所有元素具有相同的数据类型。这种数据类型在定义...