设为首页 收藏本站
查看: 2067|回复: 0

[经验分享] Oracle数据库之PLSQL集合

[复制链接]

尚未签到

发表于 2016-8-12 06:47:10 | 显示全部楼层 |阅读模式
--==================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)); -- 10
end;
----关联数组的方法:
-------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循环)
declare
type 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循环)
declare
type 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;
dbms_output.put_line(v_emp(i).id || ':'|| v_emp(i).NAME);
end loop;
end;

-- 如果数据量较大,可以采用Limit来限制fetch的数量
-- 重复上述问题:打印每个emp的ID,ENAME;(每次取出5条记录到bulk collect;
declare
cursor 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的值
begin
open emp_cur; --执行sql
LOOP
fetch emp_cur  bulk collect into v_emp limit v_limit;
exit when v_emp.count = 0;--此时游标退出使用了v_emp.COUNT
for i in v_emp.FIRST .. v_emp.LAST LOOP
dbms_output.put_line(v_emp(i).id || ':'|| v_emp(i).NAME);
end loop;
dbms_output.put_line('---------------------');
end loop;
close emp_cur;--关闭
end;




  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256524-1-1.html 上篇帖子: Oracle数据库之PLSQL基础 下篇帖子: oracle imp 与exp 参数说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表