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>