Oracle中的数组以及table()函数的使用备忘录

    首先转下数组的基本使用方法

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> 


 

你可能感兴趣的:(Oracle中的数组以及table()函数的使用备忘录)