Oracle数据库之PLSQL集合
--==================collection======================--是按某种顺序排列的一组元素,所有的元素有相同的数据类型,每个元素有唯一一个下标标识在这一组元素中的位置.--集合的出现是为了遵循面向对象的编程风格,而且 ,相对于两个表,存储在集合中的数据可以被数据库更快的访问--Collection主要有3类:-------关联数组:键值对的集合,其中键是唯一的,用于确定数组中对应的值,类似java中的hash表,-----------------键可以是整数或字符串.第一次使用键来指派一个对应的值就是添加元素,而后续这样的操作就是更新元素.-------嵌套表(后续补齐)-------Varry数组,变长数组(后续补齐)--============首先看看关联数组的使用================----TYPE 关联数组的名字 is table of 关联数组的存储元素类型[not null]---- index by [binary_integer][pls_integer][varhcar2(size)];declare--声明类型type t_indtab is table of number index by binary_integer;v_indtab t_indtab ;--声明变量v2 v_indtab%type; -- v2和v1 同类型begin v_indtab(1) :=1; v_indtab(5) :=3; v2(6) :=6; v2(6) :=10; dbms_output.put_line(v_indtab(5));-- 3 dbms_output.put_line(v_indtab(6)); -- 10end;----关联数组的方法:-------exists(n) :判断第n个元素是否存在.-------count();返回联合数组的元素个数,不包括被删除的元素.对于空的联合数组,返回值也是0------- 在使用count()方法前,建议你先用exists来判断一下.这样可以避免抛出异常.-------first/last:返回最小和最大下标号,如果collection为空,则返回null;-------prior(n)/next(n):返回第n个元素的前一个元素的下标和后一个元素的下标.如果不存在,则返回null;-------trim(n): 从最后一个元素删除n个元素.不能用于关联数组-------delete:删除所有元素-------delete(n):删除第n个元素-------delete(m,n):从第m个元素删除到第n个元素.------- 关联数组的遍历(for循环)declaretype t_ind_tab is table of number index by binary_integer;--声明类型v_indtab t_ind_tab; --定义变量begin--赋值 v_indtab(1) :=1; v_indtab(5) :=3; v_indtab(6) :=4; for i in v_indtab.first .. v_indtab.last LOOP if v_indtab. exists(i)then dbms_output.put_line(v_indtab(i)); end if ; end loop;end;------- 关联数组的遍历(while循环)declaretype ind_tab is table of varchar2(5) index by varchar2(4);v_indtab ind_tab;v_index varchar2;begin--赋值 v_indtab('a') :='1'; v_indtab('b') :='3'; v_indtab('c') :='4'; v_index := v_indtab.first; while v_index <= v_indtab.last LOOP -- 如果当前的索引下标 <= 最后一个下标dbms_output.put_line(v_indtab(v_index));v_index :=v_indtab.next(v_index); --通过next函数获取当前索引的下一个下标end loop;end;--==========批量绑定========================== --采用bulk collect可以将查询结果一次性地加载到collections中, --而不是通过cursor一条一条的处理, 通过bulkcollect减少loop处理的开销. --可以在select into ,fetch into ,returning into语句使用bulkcollect. --注意在使用bulk collect时,所有的into变量都必须是collections. -- 打印每个emp的ID,ENAME; declare --声明record类型type t_emp_rec is record( id emp.deptno%type,name emp.ename%type);--声明关联数组的类型, 存储是元素师 record类型type emp_indtab is table of t_emp_rec index by binary_integer; v_emp emp_indtab; --定义关联数组的变量begin--BULK COLLECT则一次即可提取所有行并绑定到记录变量。即谓批量绑定select deptno , ename bulk Collect into v_emp -- into的变量:必须是集合.from emp where 1 = 1 ;for i in v_emp.FIRST .. v_emp.LAST LOOP --用for操作集合-- v_emp是关联数组.访问其中的某一个元素 v_emp(i); ,不能用v_emp[i];dbms_output.put_line(v_emp(i).id || ':'|| v_emp(i).NAME);end loop;end;-- 如果数据量较大,可以采用Limit来限制fetch的数量-- 重复上述问题:打印每个emp的ID,ENAME;(每次取出5条记录到bulk collect;declarecursor emp_cur is --游标变量 查询所有的记录select deptno , ename from emp ;type emp_rec is record ( --声明类型id emp.deptno%type,name emp.ename%type);type emp_indtab is table of emp_rec index by binary_integer;v_emp emp_indtab; --定义关联数组的变量,没有初始化v_limit PLS_INTEGER := 5; --定义了一个变量来作为limit的值beginopen emp_cur; --执行sqlLOOPfetch emp_cur bulk collect into v_emp limit v_limit;exit when v_emp.count = 0;--此时游标退出使用了v_emp.COUNTfor i in v_emp.FIRST .. v_emp.LAST LOOPdbms_output.put_line(v_emp(i).id || ':'|| v_emp(i).NAME);end loop;dbms_output.put_line('---------------------');end loop;close emp_cur;--关闭end;
?