一、嵌套表
所谓嵌套表,简单地说就是把一个表作为另一个表的字段。
而众所周知,Oracle在创建表时需要指定每个字段的类型,故要使用嵌套表,首先要把被嵌套的表定义为一种类型。
而需要被定义的类型有两种,简单来看,一种是被嵌套的表的每一行记录的类型,另一种是被嵌套的表本身。
下面举例说明,以下是一个年级-班级的例子,一个年级下有多个班级。
定义记录类型的方式如下:
create type class_type as object( id number, class_name varchar2(32) );
定义表类型的方式如下:
create type class_name as table of class_type;
创建嵌套表:
create table grade ( id number, grade_name varchar2(32), classes class_name ) nested table classes store as ts_classes;
注意以上SQL的结尾部分,与普通表创建不同的是,需要指定“嵌套表的列的存储表”,上例为ts_classes,即将被嵌套的class_name类型的“列表”存储在了名为ts_classes的表中。该SQL执行后,除了创建grade表外,还会创建一个名为ts_classes的表——它是一个存储表——与普通表不同,这种表不能直接select查询,否则会抛出异常"ORA-22812: 无法参考嵌套表列的存储表"。
并且,创建嵌套表的同时,会自动在嵌套的列上加上一个unique index。如classes列上会有一个唯一索引。
对嵌套表进行各种基本操作的方式如下:
insert into grade values(1, '一年级', class_name( class_type(1, '1班'), class_type(2, '2班'), class_type(3, '3班') ) ); update table (select classes from grade where id = 1) t set value(t) = class_type(3, '4班') where t.id = 3; delete from table (select classes from grade where id = 1) t where t.id = 3;
二、可变数组
可变数组的使用跟嵌套表很相似,也需要类型定义。
下面以工厂-工人为示例。
create type worker_type as object ( id number, name varchar2(32) ); create type worker_list as varray(20) of worker_type; create table factory ( id number, name varchar2(32), workers worker_list ); insert into factory values(1, '工厂1 ', worker_list( worker_type(1, '张三'), worker_type(2, '李四'), worker_type(3, '王五') ) );
可见,与嵌套表不同的有如下几点:
1. 把定义表类型的语句替换成了定义数组的语句;
2. 不需要指定数组列的存储位置;
3. 数组列不会自动添加唯一索引。
附:
嵌套表和可变数组的表在select查询时,在PL/SQL中,嵌套表列或数组列会以Collection列的形式显示并不展示其内容,可点击查看内容;不能以编辑形式查询(笔者用的PL/SQL9.0)。
但可以如下查询将其内容一并展示:
select t.id, t.grade_name, c.* from grade t , table(t.classes) c;
相关推荐
ORACLE存储过程中定义数组并且判断某值是否在数组中。有例子可執行、 、有例子可執行、
Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考
最近在oracle 中用到拆分字符串返回数组,一直头痛,因为在 oracle 中没有类似java中有split 函数 ,所以要自己写。好不容搜到一个。那网上是到处都是这个代码。怎么找都是这个方法,我就用了。这个方法如下: ...
ORACLE数组使用方法,文档,详细介绍Oracle中数组如何使用
oracle数组操作,包含固定数组、可变数组、可变数组取表
Oracle嵌套表使用和存储分析.doc
oracle中的数组使用 oracle中的数组使用 oracle中的数组使用 oracle中的数组使用 oracle中的数组使用 oracle中的数组使用
一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。从概念上讲,可变数组是一个限制了行集合的嵌套表。
可以更改变长数组类型和嵌套表类型 元素的大小。 ALTER TYPE varray_type MODIFY ELEMENT TYPE varchar2(100) CASCADE; CASCADE选项吧更改传播到数据库中的以来对象。也可以用 INVALIDATE 选项使依赖对象无效 增加...
4. 使用JAVA存储过程(通过POI包,这也是本文的重点) 4.1至http://poi.apache.org 下载POI包,注意与ORACLE JVM版本匹配 ...至ORACL官网下载JDBC驱动,这一步不是必须的, ...目录为:$ORACLE_HOME/javavm/lib ,
oracle中存储过程和定义方法时使用的数组形式
Oracle测试表及数据.txt
基于oracle的数组实现,使用自定义类型的方式实现
第34章 收集器(嵌套表和可变数组) 第35章 使用大对象 第36章 面向对象的高级概念 第Ⅶ部分 Oracle中的Java 第37章 Java简介 第38章 JDBC程序设计 第39章 Java存储过程 第40章 Oracle真正应用群集 第41章 网格体系...
今天做了一个关于短消息批量删除的功能, ... 所以就决定用 数组作为存储过程的参数进行传值,在存储过程中批量删除。说实话这个选择有点得不偿失,本来以为上午就能搞定,谁知道从摸索到实现,居然发了大半天时间。
MLDN魔乐科技_Oracle课堂24_嵌套表、可变数组
MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组.rar
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
oracle.sql.ARRAY array = new oracle.sql.ARRAY(desc, con, var数组); -- 报错 不支持 oracle-character-set-852 pstmt.setArray(1, array); pstmt.executeUpdate(); 将10g版本配套的3个文件集中到一起, ...