ORACLE 的集合分为三类
1.index_by 表 : 类似于 C 语言中的数组
语法格式 :
TYPE tabletype
IS
TABLE OF TYPE INDEX BY BINARU_INTEGER
说明 :
tabletype 表示所定义的新类型的类型名 ,type 是要定义的 index_by 表的类型 .
例 :
TYPE xs_name -- 类型名
IS
TABLE OF XS.XM%TYPE
INDEX BY BINARU_INTEGER;/*INDEX 的类型只能是 BINARU_INTEGER*/
v_name xs_name; -- 声明变量
在声明了类型和变量后 , 就可以用下列语句使用 index_by 表中的单个元素 .
v_name(index);
说明 :
index 是指表中第几个元素
注意 :
index 的数据类型属于 BINARU_INTEGER
1) 元素赋值
可以用下面的语句给表中的元素赋值
BEGIN
v_name(1):=’qnma’;
v_name(2):=’cjh’;
v_name(-2):=’huiwen’;-- 合法
END;
注意 :
index_by 表中的元素不是按特定的顺序排序的 . 这与 C 语言不同 .index_by 表元素个数只受 BINARU_INTEGER 类型的限制 , 即 index 的范围是 -214483647~~+214483647.index 只要在此范围内就是合法的 .
2) 调用不存在的元素
调用任何元素前 , 必须首先给该元素赋值 . 如下所示 :
DECLARE
TYPE studytab
IS TABLE OF VARCHAR2(20) INDEX BY BINARU_INTEGER ;
v_studytab studytab ;
BEGIN
FOR v_count IN 1..5 LOOP
v_studytab(v_count):= v_count*10;
END LOOP;
FOR v_count IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(v_studytab(v_count));
END LOOP;
END;
2. 嵌套表 : 嵌套表与 index_by 非常相似 , 唯一不同的就是没有 INDEX BY BINARU_INTEGER
1) 嵌套表的初始化与 index_by 表完全不同 . 在声明了类型之后 , 再声明一个 index_by 表变量类型 . 如果没有给表赋值 , 那么此表就是一个空的 index_by 表 . 但是以后可以往 index_by 表中加入元素 ; 而声明了嵌套表变量类型时 , 如果嵌套表中没有任何元素 , 那么它就会自动初始化为 NULL, 并且是只读的 . 如果还想往嵌套表里加入元素 , 系统就会报错 .
如 :
DELARE
TYPE studytab
IS
TABLE OF VARCHAR(20);
v_studytab studytab:=studytab(‘Tom’,’jack’,’ROSE’);
BEGIN
FOR v_count IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(v_studytab(v_count);
END LOOP;
END;
2) 元素序列 :index_by 表中的元素是无序的 , 而嵌套表中的元素是有序的 . 嵌套表元素的 index 是从 1 开始依次递增的 .
3. 可变数组
语法格式 :
DECLARE type_name
IS
VARRAY |VARRAY ARRAY
(maximun _size)OF element_type [NOT NULL]
说明 :
type_name 是可变数组的名称 ,maxmun_size 是指可变数组元素个数的最大值 .element_type 是数组元素的数据类型 .
可变数组的可变指的是定义了数组的最大上限后 , 数组元素的个数可以在这个最大上限内变化 , 但是不得超过最大上限 . 当数组元素的个数超过了最大上限后 , 系统就会报错 . 以下定义了一个可变数组 :
DECLARE
TYPE dates
IS VARCHAY(7) OF VARCHAR2(10);
TYPE months
IS VARRAY(12) OF VARCHAR2(10);
与嵌套表一样 , 可变数组也需要初始化 . 初始化需要注意的是 : 赋值的数量必须保证不大于可变数组的最大上限 . 以下是完整实例 :
DECLARE
TYPE dates
IS VARCHAY(7) OF VARCHAR2(10);
TYPE months
IS VARRAY(12) OF VARCHAR2(10);
v_dates dates:=dates(‘Monday’,’Tuesday’,’Wednesday’) ;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_dates(1));
DBMS_OUTPUT.PUT_LINE(v_dates(2));
DBMS_OUTPUT.PUT_LINE(v_dates(3));
END;
有关集合中的方法 :
index_by 表 , 嵌套表 , 可变数组本身都是对象 , 因此它们都有自己的属性和方法 . 集合的属性和方法的调用同其他对象调用一样 :Object.Attribute 或 Object.Method.
下面是集合类常用的属性和方法 :
1.COUNT 属性 : 返回集合中的数组元素个数
DECLARE
TYPE name IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
TYPE pwd IS TABLE OF VARCHAR2(20);
TYPE dates VARRAY(7) OF VARCHAR2(20);-- 容量为 7
v_name name;
v_pwd pwd:=pwd(‘10000’,’12345’,’22’,’yes’,’no’);
v_dates dates :=dates(‘Monday’,’Sunday’);
BEEGIN
v_name(1):=’Tom’;
v_name(-1):=’Jack;
v_name(4):=’Rose;
DBMS_OUTPUT.PUT_LINE(‘The index_by count is :’||v_name.count);
DBMS_OUTPUT.PUT_LINE(‘The nested count is :’||v_pwd.count);
DBMS_OUTPUT.PUT_LINE(‘The varray count is :’||v_dates.count);-- 返回的是可变数组的实际元素个数
END;
执行结果为 :
The index_by count is:3
The nested count is:5
The varray count is:2
2.DELETE 方法
DELETE 可以删除集合中的一个或多个元素 , 需要注意的是 , 由于 DELETE 方法执行的删除操作的大小固定 , 所以对于可变数组来说没有 DELETE 方法 .DELETE 方法有 3 种方式
1)DELETE : 不带参数的 DELETE 方法 , 表示将整个集合删除
2)DELETE(x): 将集合中第 x 个位置的元素删除 .index 起始位置从 1 开始 .
3)DELETE(x,y): 将集合中从第 x 个元素到第 y 个元素之间的所有元素删除 .
注意 : 执行 DELETE 方法后 , 集合的 COUNT 值将会立刻发生变化 , 而且当删除的元素不存在时 , 系统不会报错 , 而是跳过此元素 , 继续执行下一步操作 .
3.EXISTS 属性 : 用于判断集合中的元素是否存在 . 语法格式为 :
EXISTS(X) -- 判断位于 X 位置的元素是否存在 , 存在返回 TRUE, 否则返回 FALSE
注意 :
即使是该位置是 NULL, 也会返回 TRUE
4.EXTEND 方法 : 用于将元素加到集合的末端 . 具体有以下 3 种方式 :
1)EXTEND: 不带参数的 EXTEND 是将一个 NULL 元素加入到集合的末端
2)EXTEND(x): 将 x 个 NULL 元素加入到集合的末端
3)EXTEND(x,y): 将 x 个 y 的元素加入到集合到末端 .
注意 : 由于 index_by 表的随意性 , 因此 EXTEND 方法只针对嵌套表和可变数组有效 .
5.FIRST 和 LAST 属性 :FIRST 用来返回集合的第一个元素 ,LAST 用于返回集合中的最后一个元素 .
6.LIMIT:LIMIT 用来返回集合的最大元素个数 , 由于嵌套表没有有限 , 所以嵌套表使用 LIMIT 时 , 总是返回 NULL
注意 :COUNT 是返回集合中的实际个数 , 而 LIMIT 是返回集合中的容量 .
7.NEXT 和 PRIOR 属性 :
使用 NEXT,PRIOR 时 , 它的后面都会跟一个参数
语法格式 :
NEXT(X): 表示的返回位置为 X 处的元素后面的那个元素 , 也就是返回位置为 X 的下一个元素
PRIOR(X): 同上一个相反 , 返回的是位置为 X 的前一个元素 .
通常使用 NEXT 和 PRIOR 与 FIRST 和 LAST 一起使用 , 用来处理循环 .
例 :
DECLARE
TYPE pwd IS TABLE OF VARCHAR2(20);
v_pwd:=pwd(‘10000’,’12345’,’22’,’yes’,’no’,’ok’,’all’,’hello’,’right’,’left’,’football’);
v_count integer;
BEGIN
v_count:=v_pwd.FIRST;
WHILE v_count<=v_pwd.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_pwd(v_count));
v_count:=v_pwd.NEXT(v_count);
END LOOP;
LOOP;
执行结果为 :
10000
12345
22
yes
no
ok
all
hello
right
left
football
8.TRIM 方法 : 用于删除集合末端的元素 , 其具体形式如下
1)TRIM: 不带参数的 TRIM 从集合中末端删除一个元素
2)TRIM(X) 是从集合的末端删除 X 个元素 , 其中 X 要小于集合的 COUNT 数
注意 : 与 EXTEND 一样 , 由于 index_by 表中元素的随意性 , 因此 TRIM 方法只对嵌套表和可变数组有效 .