1.集合
集合是存放一组数据类型相同的数据的组合,可以分为三种类型:索引表、嵌套表、可变长度数组。
调用集合的属性和方法时通常是 集合名字.属性名 集合名字.方法名
first --取集合的第一元素的下标 last --取集合的最后一个元素的下标 count --取集合的总长度 limit --取集合元素索引的最大值 (索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引 ) delete([n]) --删除集合中的元素,加n表示下标,删除对应下标的值 extend(n[,ind]): --扩展集合元素 n是一个数字,表示扩展的元素个数,ind是集合中的一个元素的下标,加上它表示扩展集合时,给扩展的元素加上值,值是ind这个下标对应的元素 next(下标) --取当前元素下一个元素的下标 prior(下标) --取当前元素上一个元素的下标
2.索引表
使用整数或者字符串作为下标,下标不连续,元素个数无限制,只能用在PLSQL中,不能存储在数据库中
--定义索引表类型的语法: type 类型名称 is table of 数据类型(是集合中值的数据类型)index by 下标的数据类型(varchar2,pls_integer,binary_integer); declare type mytype is table of varchar2(200) index by binary_integer; tab mytype; ind varchar2(20); begin tab(1):='张三'; tab(-2):='李四'; tab(0):='王五'; ind:=tab.first; loop dbms_output.put_line(tab(ind)); exit when ind=tab.last; ind:=tab.next(ind); end loop; end;
3.嵌套表
使用整数(只能为正)作为下标,下标是连续的;元素个数无限制的,可以用在PLSQL中,也可以存储在数据库中
--定义嵌套表类型: type 类型名称 is table of 数据类型(存储的数据的数据类型); declare type tabType is table of varchar2(200); tab2 tabType; ind pls_integer; begin tab2:=tabType('a','b','c','d'); dbms_output.put_line('tab2的长度'||tab2.count); for i in tab2.first..tab2.last loop dbms_output.put_line(tab2(i)); end loop; end; --嵌套表在数据库中的使用: create type tabType is table of varchar2(30); declare v_tab tabType; begin v_tab:=tabType('1','2','3'); for i in v_tab.first..v_tab.last loop dbms_output.put_line(v_tab(i)); end loop; end;
4.可变长度数组
使用整数(只能为正)(pls_integer,binary_integer)作为下标,下标是连续的;元素个数有限制的,可以用在PLSQL中,也可以存储在数据库中
--变长数组类型的声明 type 类型名称 is varray|varying array(长度) of 数据类型(保存的数据的数据类型); declare type arrType is varray(10) of varchar2(20); arr arrType; begin arr:=arrType('a','b','c'); dbms_output.put_line('数组的长度'||arr.count); arr.extend(7); dbms_output.put_line('数组的长度'||arr.count); end; --变长数组在数据库中的使用; create type 类型名称 is varray|varying array(长度) of 数据类型; create table 表名( 列名 数据类型, 数组列 数组类型 ); insert into 表名(列名,数组列名) values(值,数组类型(值,值,值)); select * from table(select 数组列 from 表名 where 条件);
5.BULK COLLECT
使用 select ... into 变量 只能查出一条数据保存到变量中;而 select ... bulk collect into 集合类型变量 可以查出多条数据存入一个变量中。
--查询所有员工的名字 declare type tabType is table of emp.ename%type; namelist tabType; begin select ename bulk collect into namelist from emp; for i in namelist.first..namelist.last loop dbms_output.put_line(namelist(i)); end loop; end;