数组的基本使用方法COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE() 删除元素下标为x的元素,如果x为null,则集合保持不变
对VARRAY非法
DELETE(,) 删除元素下标从X到Y的元素,如果X>Y集合保持不变
对VARRAY非法
EXIST() 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素
对Index_by非法
EXTEND() 在集合末尾添加x个元素
对Index_by非法
EXTEND(,) 在集合末尾添加元素n的x个副本
对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和对于嵌套表和Index_by为null Index_by集合无用
NEXT() 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null.
PRIOR() 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRI M 从集合末端开始删除一个元素
对于index_by不合法
TRIM() 从集合末端开始删除x个元素
-------------------------------------------------------------------------------------------------------------------
result和object的区别
二者都可以构造数组,用法也差不多。但是result是pl/sql类型,而object是对象类型。基于object类型的数组可以用在table()函数中。基于object的数组不能在package中创建
附上一个示例
--首先创建两个类
SQL> create type type_item_obj is object(str varchar2(100));
2 /
Type created
SQL> create type type_arr_obj istableof type_item_obj;
2 /
Type created
SQL>
--创建一个函数,用来将'xxx','xxxx','xxxxx'形式的字符串拆分成一组字符串放到数组中
SQL> createorreplacefunction f_dividing(i_str in varchar2) return type_arr_obj
2 PIPELINED is
3 -- arr_str type_arr_obj := type_arr_obj();
4 begin
5 for i in 1 .. trunc((length(i_str) - length(replace(i_str, ''''))) / 2) loop
6 --arr_str.extend;
7 pipe row(type_item_obj(substr(i_str,
8 instr(i_str, '''', 1, i * 2 - 1) + 1,
9 instr(i_str, '''', 1, i * 2) -
10 instr(i_str, '''', 1, i * 2 - 1) - 1)));
11 end loop;
12 return;
13 end f_dividing;
14 /
Function created
SQL> set serverout on
SQL>
--测试。将该数组结合游标使用
SQL> declare
2 v_str varchar2(10000) := '''7369'',''7499'',''1234''';
3 cursor cur_empinfo(p_str varchar2) is
4 select ename
5 from scott.emp
6 where empno in (select str fromtable(f_dividing(p_str)));
7 v_ename varchar2(100);
8 begin
9 open cur_empinfo(v_str);
10 loop
11 fetch cur_empinfo
12 into v_ename;
13 exit when cur_empinfo%notfound;
14 dbms_output.put_line(v_ename);
15 end loop;
16 close cur_empinfo;
17 end;
18 /
SMITH
ALLEN
PL/SQL procedure successfully completed
SQL>
再加一段嵌套表的操作例子
SQL>
SQL> create type typ_point1 as object(obj1 varchar2(3),obj2 varchar2(8))
2 /
Type created
SQL> create type typ_point1newt astableof typ_point1
2 /
Type created
SQL>
SQL>
SQL> createtable test_array(
2 id number,
3 obj typ_point1newt
4 )
5 nested table obj store as nested_tab returnas value
6 /
Table created
SQL>
SQL> --造些数据
SQL>
SQL> createorreplacefunction f_dividing(i_str in varchar2) return typ_point1newt
2 PIPELINED is
3 begin
4 for i in 1 .. length(i_str) - length(replace(i_str, ','))+1 loop
5 pipe row(typ_point1(i,
6 substr(i_str,
7 instr(',' i_str, ',', 1, i ) ,
8 instr(i_str ',', ',', 1, i ) -
9 instr(',' i_str, ',', 1, i ) )));
10 end loop;
11 return;
12 end f_dividing;
13 /
Function created
SQL> insertinto test_array values(1,f_dividing('a,b,c,d'));
1 row inserted
SQL> insertinto test_array values(2,typ_point1newt(typ_point1(1,'1'),typ_point1(2,'2'),typ_point1(3,'3'),typ_point1(4,'4'),typ_point1(5,'5')));
1 row inserted
SQL> commit;
Commit complete
SQL> --存储过程操作数组
SQL> set serverout on
SQL>
SQL> declare
2 v_obj typ_point1newt; --从表中获取数据
3 type typ_varray is varray(100) of varchar2(10);
4 v_array typ_varray:=typ_varray(); --定义数组
5 begin
6 select obj into v_obj from test_array where id=1;
7 for i in 1..v_obj.count loop
8 --存入数组
9 v_array.extend;
10 v_array(i):=v_obj(i).obj2;
11 end loop;
12 --输出数组
13 for j in 1..v_array.count loop
14 dbms_output.put_line(v_array(j));
15 end loop;
16 end;
17 /
a
b
c
d
PL/SQL procedure successfully completed
SQL>
--转自