Oracle集合类型介绍(二)

2014-11-24 15:17:57 · 作者: · 浏览: 2
[sql]
declare
type nest_table_type is table of emp.ename%type;
v_nest_tab nest_table_type;
begin
v_nest_tab :=nest_table_type('x');--初始化 必须! 语句 type_name(...)
select ename into v_nest_tab(1) from emp where empno=7788;
dbms_output.put_line(v_nest_tab(1));
end;
[sql]
SCOTT
PL/SQL 过程已成功完成。
e.例2:在表列中使用嵌套表 嵌套表类型的列是单独一个表存储,先创建一个这样的类型才能使用
www.2cto.com
[sql]
create type nest_tab_type is table of varchar2(30);
create table test_nest_tab(
id int,
vals nest_tab_type --使用
) nested table vals store as nest_tab;--vals字段用嵌套表存储,表明nest_tab
--上面语句执行完之后,在生成TEST_NEST_TAB的同时会生出一个关联表NEST_TAB用来存储关联表的数据
--插入数据
insert into test_nest_tab values(1,nest_tab_type('one','two','three','four'));
--查询数据
declare
v_id int;
v_tab nest_tab_type;
begin
select * into v_id,v_tab from test_nest_tab where id=1;
dbms_output.put_line(v_id);
for i in 1..v_tab.count loop
dbms_output.put_line(v_tab(i));
end loop;
end;
[sql]
1
one
two
three
four
PL/SQL 过程已成功完成。
3)Varry 可变数组
a. 定义
TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];
b. 这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。
c. 使用时也必须先用构造方法初始化 ,可以作为表列类型
d. 例1:
www.2cto.com
[sql]
declare
type varr is VARRAY(10) of int;
v_varr varr :=varr();
begin
--dbms_output.put_line(varr.count);
for i in 1..5 loop
v_varr.extend;
v_varr(i) :=i*i;
end loop;
for i in 1..5 loop
dbms_output.put_line(v_varr(i));
end loop;
end;
/
[sql]
1
4
9
16
25
PL/SQL 过程已成功完成。
www.2cto.com
e.例2:可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表
[sql]
create type varr_type is varray(10) of varchar2(30);--先创建类型
create table test_varray(
id int,
name varchar2(30),
params varr_type --param是使用可变数组类型
);
--插入数据
insert into test_varray values(1,'bird',varr_type('a','b','c'));
--查询数据
declare
v_varr varr_type;
v_name test_varray.name%type;
begin
select name,params into v_name,v_varr from test_varray where id=1;
for i in 1..v_varr.count loop
dbms_output.put_line(v_varr(i));
end loop;
end;
[sql]
a
b
c
PL/SQL 过程已成功完成。
www.2cto.com
5. 如何选择适用的集合类型:
通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库
  如果你需要允许使用负数索引,应该选择Associative array;
  如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;
  如果你需要限制集合元素的个数,应该选择VARRAY。