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

[经验分享] Oracle——13集合

[复制链接]

尚未签到

发表于 2016-6-23 08:37:51 | 显示全部楼层 |阅读模式
  

  
PL/SQL语言的集合类似于数组,是管理多行数据必须的结构体。集合就是列表,可能有序,也可能无序。PL/SQL的集合类型有:联合数组、嵌套表和可变数组三种。
  
  1、联合数组
  联合数组类似于C语言中的数组。
  (1)语法格式如下:
  

type typeName
is table of arrayType index by binary_integer;
   
  其中,typeName表示新类型的类型名,arrowType表示要定义的联合数组的类型。
  假设有一个表t_module(name varchar(20)),那么我们可以针对其name字段建立如下联合数组:
  

type moduleName is table of t_module.name%type index by binary_integer;
   
  (2)元素赋值
  示例代码如下:
  

declare
type NameArray
is table of varchar(20) index by binary_integer; /*定义联合数组NameArrow*/
na NameArray; /*声明联合数组NameArrow的一个变量*/
begin
na(1) := 'Hello'; /*给联合数组赋值*/
na(2) := 'World'; /*给联合数组赋值*/
na(5) := 'Oracle'; /*给联合数组赋值*/
dbms_output.put_line(na(1) || na(2));
end;
   
  注意:
  a.联合数组中的元素不是按特定顺序排列的,元素的下标也是可以无序的,所以nameArrow(-100) := 'Hello'也是可以的。
  b.index的数据类型是binary_integer类型,所以index的范围为-214483647~+214483647。
  c.当调用不存在的元素时将会出错。
  
  2、嵌套表
  嵌套表的声明和联合数组的声明十分类似。语法格式如下:
  

type typeName is table of arrayType [not null]
   嵌套表的声明与联合数组的唯一不同是没有index by binary_integer子句。
  (1)嵌套表的初始化
  嵌套表的初始化和联合数组的初始化是不同的。在声明了联合数组之后,再声明一个联合数组对应的变量,如果此时没有给该变量赋值,那么该变量对应的联合数组就是一个空的,在以后的语句中还可以给该联合数组添加元素;而如果在声明了嵌套表变量时没有初始化,则该嵌套表将自动初始化为null,并且是只读的。如果在后续代码中继续向该嵌套表中添加元素,就会报错,但是可以修改已经存在的元素的值。
  以下是一个嵌套表的初始化示例:
  

declare
type NameArray is table of varchar(20);
na NameArray := NameArray('ZhangSan', 'LiSi', 'WangWu'); /*在声明的时候即初始化该嵌套表*/
begin
for nameIndex in 1..3 loop
dbms_output.put_line(na(nameIndex));
end loop;
end;
   (2)元素序列
  嵌套表与联合数组十分相似,只是嵌套表在结构上是有序的,而联合数组是无序的。嵌套表元素的index是从1开始递增的。
  
  3、可变数组
  先来看可变数组的语法格式:
  

type typeName is varray | varying array(maximunSize) of arrayType [not null]
   maximunSize是指可变数组的最大值,arrayType表示数组元素的类型。
  可变数组的可变是指当定义了数组的最大容量后,数组元素的个数可在这个范围内进行变动。
  与嵌套表一样,可变数组也需要初始化,在初始化后也只能修改已经存在的元素值,初始化时赋值的数量必须不超过最大容量。
  以下是一段示例代码:
  

declare
type NameArray is varray(10) of varchar(20);
na NameArray := NameArray('ZhangSan', 'LiSi', 'WangWu');
begin
for nameIndex in 1..3 loop
dbms_output.put_line(na(nameIndex));
end loop;
end;
   
  4、集合的属性和方法
  (1)count属性
  count属性用于返回集合中数组元素的个数。
  示例代码:
  na.count;/*在上面例子中调用该语句将返回3*/
  (2)delete方法
  delete方法用于删除集合中的一个或多个元素。由于delete方法删除的是固定位置的元素,所以对应可变数组来说是没有
  delete方法的。delete方法有3中形式:
  delete:不带参数的delete方法将删除整个集合。
  delete(index):将删除集合中第index个位置的元素。
  delete(start, end):将删除集合中从start到end的元素。
  注意:
  a.执行delete方法后,集合的count值将会立即发生改变。
  b.执行delete操作后,其他元素的index不会发生改变。
  c.当要删除的元素不存在时,delete不会报错,而是跳过该元素,继续执行下一操作。
  (3)exists方法
  exists方法用于判断集合中指定位置的元素是否存在。
  语法格式如下:
  exists(index);
  如果index位置的元素存在即返回true,否则就是false,如果index大于集合的最大范围,则返回false。
  (4)extend方法
  extend方法用于将元素添加到集合的末端,由于联合数组的随意性,所以该方法不能对联合数组使用,有以下几种形式:
  extend:不带参数的extend方法将添加一个null元素到集合的末端
  extend(n):将添加n个null元素到集合的末端。
  extend(n, x):将添加n个x位置的元素到集合的末端。
  (5)first属性和last属性
  first属性用于返回集合中的第一个元素所在的位置,last属性用于返回集合中的最后一个元素所在的位置。
  (6)limit属性
  limit属性用于返回集合的最大容量,该属性只有对可变数组才有返回值,对其他的则返回null。
  (7)next方法和prior方法
  next方法和prior方法都有一个表示index的参数,语法格式为:
  next(index);
  prior(index);
  next(index)返回集合中index后一个元素的位置,而prior(index)方法则返回集合中index位置前一个元素的位置,如果对应返
  回的位置不存在则返回null。
  (8)trim方法
  trim方法用于从集合的末端删除元素,由于联合数组的随意性,所以不能对联合数组使用trim方法,有以下两种形式:
  trim:不带参数的trim从集合末端删除一个元素。
  trim(n):从集合末端删除n个元素,其中n不能超出集合的count数。

运维网声明 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.iyunv.com/thread-233897-1-1.html 上篇帖子: oracle第二天 下篇帖子: oracle函数一览
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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