1. 程式人生 > >Oracle中的陣列以及table()函式的使用備忘錄

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>