首先转下数组的基本使用方法
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 is table of type_item_obj; 2 / Type created SQL> --创建一个函数,用来将'xxx','xxxx','xxxxx'形式的字符串拆分成一组字符串放到数组中 SQL> create or replace function 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 from table(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 as table of typ_point1 2 / Type created SQL> SQL> SQL> create table test_array( 2 id number, 3 obj typ_point1newt 4 ) 5 nested table obj store as nested_tab return as value 6 / Table created SQL> SQL> --造些数据 SQL> SQL> create or replace function 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> insert into test_array values(1,f_dividing('a,b,c,d')); 1 row inserted SQL> insert into 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>