-
Oracle集合类型介绍集合类型1. 使用条件:a. 单行单列的数据,使用标量变量 。b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接http://www.2cto.com/database/201210/163097.html ]c. 单列多行数据,使用集合*集合:类似于 编程语言中数组也就是。pl/sql集合类型包括关联数组Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)。www.2cto.com2. 三种集合类型区别:Nested table与VARRY既可以被用于PL/SQL,也可以被直接用于 数据库中,但是Associative array不行,也就是说,Associative array是不能通过CREATE TYPE语句进行单独创建,只能在PL/SQL块(或Package)中进行定义并使用(即适用范围是PL/SQL Block级别),而Nested table与VARRAY则可以使用CREATE TYPE进行创建(即适用范围是Schema级别),它们还可以直接作为数据库表中列的类型。3. 集合的方法:www.2cto.comexists(index) 索引处的元素是否存在count 当前集合中的元素总个数limit 集合元素索引的最大值索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引first 返回集合第一个元素索引last 返回集合最后一个元素索引prior 当前元素的前一个next 当前元素的后一个extend 扩展集合的容量,增加元素 只是用于嵌套表和varry类型x.extend 增加一个null元素x.extend(n) 增加n个null元素x.extend(n,i) 增加n个元素,元素值与第i个元素相同trim 从集合的尾部删除元素 只用于NEST TABLE和VARRY类型trim 从集合尾部删除一个元素trim(n) 从集合尾部删除n个元素delete 按索引删除集合元素delete 删除所有delete(index) 删除第index个delete(a,b) 删除a--b之间的所有元素4. 集合类型的声明与初始化:1)关联数组:a. 下标无限制,可以为负数b. 元素个数无限制c. 定义TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;type_name:用户自定义数据类型的名字element_type:索引表中元素类型key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)d. 例1:www.2cto.com[sql]declaretype index_tab_type is table of varchar2(30) index by BINARY_INTEGER;v_table index_tab_type;beginv_table(-1) :='hello';--设定下标为-1的元素的值v_table(1) :=',';dbms_output.put_line(v_table(-1)||'-'||v_table(1));dbms_output.put_line('元素个数:'||v_table.count);v_table(5) :='world';dbms_output.put_line('元素个数:'||v_table.count);dbms_output.put_line('第一个元素'||v_table.first);dbms_output.put_line('最后一个元素'||v_table.last);end;/[sql]hello-,元素个数:2元素个数:3第一个元素-1最后一个元素5www.2cto.comPL/SQL 过程已成功完成。e.例2:使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value(键值对)形式存储[sql]declaretype index_tab_type is table of varchar2(30) index by varchar2(30);v_table index_tab_type;v_record emp%rowtype;begin--emp表中查询3条记录,以name-job的形式存储到索引表中select * into v_record from emp where emp.empno=7788;v_table(v_record.ename):= v_record.job;select * into v_record from emp where emp.empno=7844;v_table(v_record.ename):= v_record.job;select * into v_record from emp where emp.empno=7900;v_table(v_record.ename):= v_record.job;dbms_output.put_line(v_table.count);--3dbms_output.put_line(v_table(v_record.ename));--CLERKend;/[sql]3CLERKPL/SQL 过程已成功完成。2)嵌套表 Nested Tablea. 下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)b. 可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了定义TYPE type_name IS TABLE OF element_type;c. 和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的 .d.例1:www.2cto.com[sql]declaretype nest_table_type is table of emp.ename%type;v_nest_tab nest_table_type;beginv_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]SCOTTPL/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'));--查询数据declarev_id int;v_tab nest_tab_type;beginselect * 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 loopdbms_output.put_line(v_tab(i));end loop;end;[sql]1onetwothreefourPL/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]declaretype varr is VARRAY(10) of int;v_varr varr :=varr();begin--dbms_output.put_line(varr.count);for i in 1..5 loopv_varr.extend;v_varr(i) :=i*i;end loop;for i in 1..5 loopdbms_output.put_line(v_varr(i));end loop;end;/[sql]1491625PL/SQL 过程已成功完成。www.2cto.come.例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'));--查询数据declarev_varr varr_type;v_name test_varray.name%type;beginselect name,params into v_name,v_varr from test_varray where id=1;for i in 1..v_varr.count loopdbms_output.put_line(v_varr(i));end loop;end;[sql]abcPL/SQL 过程已成功完成。www.2cto.com5. 如何选择适用的集合类型:通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库。如果你需要允许使用负数索引,应该选择Associative array;如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;如果你需要限制集合元素的个数,应该选择VARRAY
。
Oracle集合类型介绍
最新推荐文章于 2023-03-09 17:54:56 发布