oracle:变长数组varray,嵌套表,集合
CREATE TYPE varray_type AS VARRAY(2) OF VARCHAR2(50);
这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50)
更改元素类型的大小或精度
可以更改变长数组类型和嵌套表类型 元素的大小。
ALTER TYPE varray_type
MODIFY ELEMENT TYPE varchar2(100) CASCADE;
CASCADE选项吧更改传播到数据库中的以来对象。也可以用 INVALIDATE 选项使依赖对象无效
增加变长数组的元素数目
ALTER TYPE vrray_name
MODIFY LIMIT 5 CASCADE;
使用变长数组
CREATE TABLE table_name(
column_name type,
var_col_name varray_type
);
获得变长数组的信息
DESC[RIBE] varray_type; SELECT *
FROM user_varrays
WHERE type_name = varray_name;
DESC 获得的是 varray_type AS VARRAY(2) OF VARCHAR2(50)
填充变长数组元素

INSERT INTO table_name VALUES(
value,
varray_type(
'xxxx',
'xx',
'x')
);

可以一次向变长数组添加多个数据。
查找变长数组元素
SELECT *
FROM table_Name;
如果变长数组中的元素有多个,会一起输出,输出的数据列是一个长列,跟包含对象的表一样。
更改变长数组元素
要想更改变长数组的一个元素,需要把其他元素一起更改,整个变长数组作为一个整体来的。
UPDATE table_name
SET var_col_name = varray_type('xxx','xxxxxx')
WHERE expr1;
创建嵌套表类型
CREATE TYPE table_type AS TABLE OF type;
其中type 可以为任何类型,包括varray 和 object ,通常object 居多。
使用嵌套表类型

CREATE TABLE table_name(
column_name type,
tab_col_name table_type
)
NESTED TABLE
table_col_name
STORE AS
next_table_name [TABLESPACE user_name];

创建嵌套表的时候要为嵌套表类型另外创建一个表来保存数据, NESTED 以下的部分就是在干这事。那个表的名称为: next_table_name
TABLESPACE 可以将另外创建表放到另外的空间。
获得表信息
SET DESCRIBE DEPTH 2
DESC[RIBE] table_name;
也可以直接通过数据字典来获得嵌套表的信息
SELECT *
FROM user_nested_tables
WHERE table_name = xxxx;
填充、查找嵌套表元素
跟变长数组方法一样
更改嵌套表元素
跟变长数组不同,嵌套表的元素可以单独更改:可以插入、更改和删除嵌套表元素。
插入:
INSERT INTO TABLE(
SELECT tab_col_name FROM table_name WHERE expr)
VALUES(
table_type('xxxx')
)
);
更改:

UPDATE TABLE(
SELECT tab_col_name FROM table_name WHERE expr
) T
SET
VALUE(T) = table_type(
'xxxx')
)
WHERE
VALUE(T) = table_type(
expr2
);

T 为获得需要修改的那行数据对应的 嵌套表位置,WHERE 为判断语句,如果table_type 为object类型,expr2 这样写: 'x','xx','xxx'
删除:

DELETE FROM TABLE(
SELECT tab_col_name FROM table_name WHERE expr
)T
WHERE
VALUE(T) = table_type(
expr2
);

集合方法
EXISTS(N) |
如果第n个元素存在,返回TRUE |
COUNT |
该函数集合元素的数目 |
DELETE DELETE(n) DELETE(n,m) |
删除集合元素 l 删除所有元素 l 删除第n个元素 l 删除n到m的元素 |
FIRST |
返回集合第一个(最小的)元素索引号,如果集合为空,返回NULL |
LAST |
返回集合中最后一个(最大的)元素索引号,如果集合为空,返回NULL |
NEXT(n) |
返回集合当前元素的下n元素的索引号,如果它不存在就返回NULL |
PRIOR(n) |
返回集合当前元素的前n元素的索引号,如果它不存在就返回NULL |
LIMIT |
返回varray中创建元素的最大个数 |
EXTEND EXTEND(n) EXTEND(n,m) |
增加集合的大小。 l 添加一个,设为空 l 添加n个,设为空 l 添加n个,设为m |
TRIM TRIM(n) |
从集合末尾处删除元素 l 删除一个 l 删除n个 |
调用方法是: tab_col_name.COUNT
嵌套表运算符操作
例如:
var_tab_1 table_type;
var_tab_2 table_type;
var_tab_3 table_type;
reslut BOOLEAN;
var_tab_1 :=table_type('1','2');
var_tab_2 :=table_type('3','4');
var_tab_3 :=table_type('2','1');
result:= var_tab_1 =var_tab_3 result 为true;
result:= var_tab_2 <>var_tab_3 result 为true;
IN 和 NOT IN 运算符
用于检测一个嵌套表的内容是否出现在令一个嵌套表的内容中。
result:= var_tab_1 IN (var_tab_3); result 为 TRUE;
result:= var_tab_2 NOT IN (var_tab_3); result 为 TRUE;
SUBMULITSET 子集运算符
检查一个嵌套表的内容是否为另外一个嵌套表的子集
result:= var_tab_1 SUBMULITSET OF var_tab_3 result 为TRUE;
MULTISET 集合运算符
返回的是一个嵌套集
MULTISET UNION
MULTISET INTERSECT
MULTISET EXCEPT
并 交 差 ,另外还有
ALL 全部
DISTINCT 去重
var_tab1 := var_tab2 MUSTISET UNION ALL var_tab2
CARDINALITY 获得嵌套表中元素数目
CARDINALITY(var_tab1)
(跟count 有什么不同。。- -!)
MEMBER OF 运算符
检测嵌套表的一个元素是否存在
'xxx' MEMBER OF var_tab1; 返回BOOLEAN
SET 运算符
将传入的嵌套表去重后返回
var_tab1 := SET (var_tab2);
IS A SET
判断时候符合每个元素都不同
result:= var_tab1 IS A SET;
IS EMPTY
判断嵌套表是否为空
COLLECT 运算符
将值列表作为嵌套表返回,可以配合 CAST 运算符将返回的嵌套表强制转换为一种嵌套表类型。
SELECT COLLECT(column_name)
FROM TABLE
WHERE expr;
POWERMULTISET
获得嵌套表的子嵌套表
SELECT *
FROM TABLE(
POWERMULTISET(table_tpye('',''))
);
获得
table_type('')
table_type('')
table_type('','')
注意:PS/SQL 不支持这个
POWERMULTISET_BY_CARDINALITY
获得指定长度以下的嵌套表
SELECT *
FROM TABLE(
POWERMULTISET_BY_CARDINALITY(table_tpye('',''),2)
);
获得
table_type('','')
PS/SQL 不支持这个
oracle:变长数组varray,嵌套表,集合的更多相关文章
- PL/SQL 嵌套表变长数组和索引表[转]
关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...
- PL/SQL — 变长数组
PL/SQL变长数组是PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限制的.也即是说变长数组的下标固定下限等于1,上限可以扩展.下 ...
- oracle 之 数组、嵌套表、SQL查询式 实现多表数据for循环插入指定表
1.基础环境 创建基础表: CREATE TABLE TEST_TAB1( ID INT, NAME VARCHAR2(20) ); CREATE TABLE TEST_TAB2( ID INT, N ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C99新特性:变长数组(VLA)
C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...
- c语言,变长数组
下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...
- C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
随机推荐
- Kernel Bypass & Offload 介绍
系统网络优化可以有两方面的工作可以做:1 绕开内核(bypass):2 用硬件替代软件(offload). 具体包括: 1. 绕开内核: 不使用内核内核子系统的功能,采用自己实现的相同功能的代码来处理 ...
- 0x1L
整形常量的后缀表示其类型,包括如下后缀,其中U和L的大小写通用 后缀 类型L long int LL long long int U ...
- BZOJ4033 T1
Description 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0-N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色,并将其他的\(N-K\)个点染成白色.将 ...
- dede织梦跨频道调用指定栏目文章的解决方法
很久没有写技术类的文章了,这次这个标题写的- 呃, 有一点儿纠结. 事情是这样的,刚刚回答了一个百度问答上的问题,这个问题的大体意思是,有一个图片栏目,内含3个子栏目,分别为图片栏目1.2和3,另有三 ...
- google font和@font-face
会使用google字体 网址: http://www.google.com/fonts/ 选择字体, quick use 引用css: <link href='http://fonts.goog ...
- Linux学习笔记6——映射虚拟内存
使用到两个函数mmap:用于分配内存:munmap:用于释放内存. mmap的原型如下: void *mmap( void *start, //指定映射的虚拟地址 0由系统指定开始位置 ...
- HDU 2089 不要62(挖个坑=-=)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Hdu 4010-Query on The Trees LCT,动态树
Query on The Trees Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Othe ...
- 高性能I/O设计模式Reactor和Proactor
系统I/O 可分为阻塞型, 非阻塞同步型,非阻塞异步型. (Linux对aio支持的不完整,所以linux上用Reactor比较多:Proactor需要系统API支持真正的“异步”) 阻塞型I/O意味 ...
- poj 1050 To the Max (简单dp)
题目链接:http://poj.org/problem?id=1050 #include<cstdio> #include<cstring> #include<iostr ...