oracle中变长数组varray,嵌套表,集合使用方法
创建变长数组类型
CREATETYPEvarray_typeASVARRAY(2)OFVARCHAR2(50);
这个变长数组最多可以容纳两个数据,数据的类型为varchar2(50)
更改元素类型的大小或精度
可以更改变长数组类型和嵌套表类型元素的大小。
ALTERTYPEvarray_type MODIFYELEMENTTYPEvarchar2(100)CASCADE;
CASCADE选项吧更改传播到数据库中的以来对象。也可以用INVALIDATE选项使依赖对象无效
增加变长数组的元素数目
ALTERTYPEvrray_name MODIFYLIMIT5CASCADE;
使用变长数组
CREATETABLEtable_name( column_nametype, var_col_namevarray_type );
获得变长数组的信息
DESC[RIBE]varray_type; SELECT* FROMuser_varrays WHEREtype_name=varray_name;
DESC获得的是varray_typeASVARRAY(2)OFVARCHAR2(50)
填充变长数组元素
INSERTINTOtable_nameVALUES( value, varray_type( 'xxxx', 'xx', 'x') );
可以一次向变长数组添加多个数据。
查找变长数组元素
SELECT* FROMtable_Name;
如果变长数组中的元素有多个,会一起输出,输出的数据列是一个长列,跟包含对象的表一样。
更改变长数组元素
要想更改变长数组的一个元素,需要把其他元素一起更改,整个变长数组作为一个整体来的。
UPDATEtable_name SETvar_col_name=varray_type('xxx','xxxxxx') WHEREexpr1;
创建嵌套表类型
CREATETYPEtable_typeASTABLEOFtype;
其中type可以为任何类型,包括varray和object,通常object居多。
使用嵌套表类型
CREATETABLEtable_name( column_nametype, tab_col_nametable_type ) NESTEDTABLE table_col_name STOREAS next_table_name[TABLESPACEuser_name];
创建嵌套表的时候要为嵌套表类型另外创建一个表来保存数据,NESTED以下的部分就是在干这事。那个表的名称为:next_table_name
TABLESPACE可以将另外创建表放到另外的空间。
获得表信息
SETDESCRIBEDEPTH2 DESC[RIBE]table_name;
也可以直接通过数据字典来获得嵌套表的信息
SELECT* FROMuser_nested_tables WHEREtable_name=xxxx;
填充、查找嵌套表元素
跟变长数组方法一样
更改嵌套表元素
跟变长数组不同,嵌套表的元素可以单独更改:可以插入、更改和删除嵌套表元素。
插入:
INSERTINTOTABLE( SELECTtab_col_nameFROMtable_nameWHEREexpr) VALUES( table_type('xxxx') ) );
更改:
UPDATETABLE( SELECTtab_col_nameFROMtable_nameWHEREexpr )T SET VALUE(T)=table_type( 'xxxx') ) WHERE VALUE(T)=table_type( expr2 );
T为获得需要修改的那行数据对应的嵌套表位置,WHERE为判断语句,如果table_type为object类型,expr2这样写:'x','xx','xxx'
删除:
DELETEFROMTABLE( SELECTtab_col_nameFROMtable_nameWHEREexpr )T WHERE VALUE(T)=table_type( expr2 );
集合方法
调用方法是:tab_col_name.COUNT
嵌套表运算符操作
例如:
var_tab_1table_type;
var_tab_2table_type;
var_tab_3table_type;
reslutBOOLEAN;
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和NOTIN运算符
用于检测一个嵌套表的内容是否出现在令一个嵌套表的内容中。
result:=var_tab_1IN(var_tab_3);result为TRUE;
result:=var_tab_2NOTIN(var_tab_3);result为TRUE;
SUBMULITSET子集运算符
检查一个嵌套表的内容是否为另外一个嵌套表的子集
result:=var_tab_1SUBMULITSETOFvar_tab_3result为TRUE;
MULTISET集合运算符
返回的是一个嵌套集
MULTISETUNION
MULTISETINTERSECT
MULTISETEXCEPT
并交差,另外还有
ALL全部
DISTINCT去重
var_tab1:=var_tab2MUSTISETUNIONALLvar_tab2
CARDINALITY获得嵌套表中元素数目
CARDINALITY(var_tab1)
(跟count有什么不同。。--!)
MEMBEROF运算符
检测嵌套表的一个元素是否存在
'xxx'MEMBEROFvar_tab1;返回BOOLEAN
SET运算符
将传入的嵌套表去重后返回
var_tab1:=SET(var_tab2);
ISASET
判断时候符合每个元素都不同
result:=var_tab1ISASET;
ISEMPTY
判断嵌套表是否为空
COLLECT运算符
将值列表作为嵌套表返回,可以配合CAST运算符将返回的嵌套表强制转换为一种嵌套表类型。
SELECTCOLLECT(column_name) FROMTABLE WHEREexpr;
POWERMULTISET
获得嵌套表的子嵌套表
SELECT* FROMTABLE( POWERMULTISET(table_tpye('1','2')) );
获得
table_type('1') table_type('2') table_type('1','2')
注意:PS/SQL不支持这个
POWERMULTISET_BY_CARDINALITY
获得指定长度以下的嵌套表
SELECT* FROMTABLE( POWERMULTISET_BY_CARDINALITY(table_tpye('1','2'),2) );
获得
table_type('1','2')
PS/SQL不支持这个