Oracle中的数组以及table()函数的使用_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1840 | 回复: 0   主题: Oracle中的数组以及table()函数的使用        下一篇 
tangbao@.@
注册用户
等级:新兵
经验:67
发帖:62
精华:0
注册:2011-7-21
状态:离线
发送短消息息给tangbao@.@ 加好友    发送短消息息给tangbao@.@ 发消息
发表于: IP:您无权察看 2015-7-30 12:20:43 | [全部帖] [楼主帖] 楼主

数组的基本使用方法

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>


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论