文章目录

  • 一、Oracle集合的定义
  • 二、集合的组成
  • 三、集合的类型
    • 集合常用的属性和方法
    • 3.1 索引表类型
      • 3.1.1 索引表的语法
      • 3.1.2 索引表的使用案例
        • 案例1:定义一个索引表类型(下标为数字类型),用定义的索引表类型声明一个索引变量用于存放三个姓名,并输出存放的第一个姓名
        • 案例2:定义一个索引表类型(下标为字符串类型)并使用,测试集合的常用属性和方法
      • 3.1.3 语句循环遍历
        • 语法1
        • 语法2
        • 语法3
    • 3.2 嵌套表
      • 3.2.1 在PL/SQL中使用
      • 3.2.2 在数据库使用
      • 3.2.3 在建表时使用
    • 3.3 变长数组
      • 3.3.1 在PL/SQL中使用
      • 3.3.2 在数据库使用
      • 3.3.3 在建表时使用

一、Oracle集合的定义

集合是Oracle中的一种数据类型,存放一组数据类型相同的数据。

二、集合的组成

下标组成。
下标的类型包含 数字类型(整数类型、pls_integer和binary_integer) 和 字符串类型
的类型是数据库中所有的类型(基本数据类型、记录类型(record、%rowtype、%type)和集合类型)。
pls_integer和binary_integer相当于number类型,但比number类型占用内存较少、算术运算速度更快。
pls_integer进行的运算发生溢出时,会触发异常,执行是由硬件cpu来运行的,执行速度快.binary_integer不会触发异常,类型变量时由Oracle来执行的,不会溢出,但是执行慢,都是整形类型。

三、集合的类型

集合是一个比较广义的概念,在PL/SQL中提供了3种类型的集合:
索引表:可以通过数字或字符串作为下标来查找其中的元素,只能在PL/SQL中使用
嵌套表:拥有索引表的所有特性,但是下标只能是数据类型(连续的整数)。在PL/SQL和数据库中均可使用
变长数组:下标只能是数字类型,创建时需要指定最大长度。在PL/SQL和数据库中均可使用

集合常用的属性和方法

集合属性/方法 描述
first 取集合第一个元素的下标
last 取集合最后一个元素的下标
next(下标) 取集合当前元素的下一个元素的下标
prior(下标) 取集合当前元素的上一个元素的下标
count 得到集合中元素的个数
delete 删除集合中的元素
limit 去集合最大元素的个数(变长数组)

3.1 索引表类型

3.1.1 索引表的语法

--定义索引表类型的语法:
type 类型名称 is table of 元素值的数据类型 index by 下标的数据类型;
--索引变量的声明
变量名 类型名;
--索引变量的使用
变量名(下标);

3.1.2 索引表的使用案例

案例1:定义一个索引表类型(下标为数字类型),用定义的索引表类型声明一个索引变量用于存放三个姓名,并输出存放的第一个姓名

declaretype type1 is table of varchar2(30) index by pls_integer;names type1;
beginnames(1):='小曹同学1';names(2):='小曹同学2';names(3):='小曹同学3';dbms_output.put_line(names(1));
end;

案例2:定义一个索引表类型(下标为字符串类型)并使用,测试集合的常用属性和方法

declaretype type2 is table of varchar2(30) index by varchar2(10);names type2;
beginnames('a'):='小曹同学1';names('b'):='小曹同学2';names('c'):='小曹同学3';dbms_output.put_line(names.first); --adbms_output.put_line(names.last); --cdbms_output.put_line(names.next(names.first)); --bdbms_output.put_line(names.prior(names.last)); --bdbms_output.put_line(names.count); --3names.delete;
end;

3.1.3 语句循环遍历

集合提供了 bulk collect 语句获取表中数据。
通过 bulk collect 语句存入集合中的元素下标从1开始且是连续的,且集合下标必须是数字类型

语法1

select 列.. bulk collect into 集合变量 from 表 where条件
--案例:
declaretype i_empno is table of emp.empno%type index by pls_integer;type i_ename is table of emp.ename%type index by pls_integer;eno i_empno;ena i_ename;
beginselect empno,ename bulk collect into eno,ena from emp where deptno=30;for i in eno.first..eno.last loopdbms_output.put_line(eno(i) || ' ' || ena(i));end loop;
end;

语法2

execute immediate 'select语句' bulk collect into 集合变量
--案例
declare--声明一个变量存放select查询结果v_sql varchar2(255);--定义索引表集合存储emp表中empno和enametype i_empno is table of emp.empno%type index by pls_integer;type i_ename is table of emp.ename%type index by pls_integer;--定义索引变量eno i_empno;eme i_ename;
begin--将sql语句赋值给v_sqlv_sql:='select empno,ename from emp where deptno=30';--bulk collect语句,将v_sql查询到的结果放到eno和eme中execute immediate v_sql bulk collect into eno,eme;--循环打印eno和eme中所有的数据for i in eno.first..eme.last loopdbms_output.put_line(eno(i) || ' ' || eme(i));end loop;
end;

语法3

fetch 游标 bulk collect into 集合变量
--案例
declare--声明一个游标cursor cursor1 is select empno,ename from emp where deptno=30;--定义索引表集合存储emp表中empno和enametype i_empno is table of emp.empno%type index by pls_integer;type i_ename is table of emp.ename%type index by pls_integer;--定义索引变量eno i_empno;eme i_ename;
begin--打开游标open cursor1;--bulk collect 语句fetch cursor1 bulk collect into eno,eme;--关闭游标close cursor1;--循环打印eno和eme中所有的数据for i in eno.first..eme.last loopdbms_output.put_line(eno(i) || ' ' || eme(i));end loop;
end;

3.2 嵌套表

嵌套表和索引表一样都是存放一组数据类型相同的数据。
它的下标只能是整数类型(下标是连续的整数)。
在使用前需要初始化嵌套表变量。

3.2.1 在PL/SQL中使用

3.2.1.1 语法

--语法:
type 类型名 is table of 存储的数据的数据类型(长度);
--声明变量:
变量名 嵌套表类型名;
--初始化赋值:
变量名:=嵌套表类型名();
--初始化一个带元素的嵌套表
变量名:=嵌套表类型名(值,值,值,..,值);
--扩展嵌套表
变量名.extend(n);
--赋值:
变量名(下标):=值;

3.2.1.2 使用案例
案例1:初始化一个空的嵌套表

declaretype mytype is table of varchar2(20);c1 mytype;
begin--初始化c1 := mytype();dbms_output.put_line(c1.count);--将嵌套表c1扩展两个元素c1.extend(2);dbms_output.put_line(c1.count);c1(1) := 'A';c1.extend(5);for i in 2..6 loopc1(i) := chr(64 + i);end loop;for i in c1.first..c1.last loopdbms_output.put_line(c1(i));end loop;
end;

案例2:初始化一个带元素的嵌套表

declare--定义一个嵌套表type mytype is table of varchar2(20);c2 mytype;
begin--初始化一个带元素的嵌套表c2 := mytype('张三','李四','王五','赵六');--嵌套表c2扩展2个元素c2.extend(2);c2(5):='小米';c2(6):='小曹同学';--遍历嵌套表for i in c2.first..c2.last loopdbms_output.put_line(c2(i));end loop;
end;

3.2.2 在数据库使用

如果在pl/sql中使用嵌套表,那么其功能与索引表比较相似。
嵌套表的一个重要的特色是支持作为数据表列 存储,因此可以将嵌套表存储在数据表中或者从数据表中取出嵌套表,这是索引表不具有的功能。
为了让嵌套表类型能在数据表中使用,要求嵌套表类型必须保存到数据字典中因此需要使用 create type 语句创建一个持久的嵌套表类型。

3.2.2.1 语法

create type 类型名 is table of 元素数据类型;

3.2.2.2 案例

create type ctype is table of varchar2(30);
declarec ctype;
beginselect ename bulk collect into c from emp where deptno=10;for i in c.first..c.last loopdbms_output.put_line(c(i));end loop;
end;

3.2.3 在建表时使用

3.2.3.1 语法

--创建语法:
create table 表名(列名 类型,嵌套表列名 嵌套表类型
)nested table 嵌套表列名 store as 表名;
--插入数据
insert into 表名(字段名1,字段名2)values(嵌套表类型名称(值1),嵌套表类型名称(值2));

3.2.3.2 案例

create table x(id number(10),namelist ctype
)nested table namelist store as y;--插入数据
insert into x(id,namelist)values(1,ctype('小红','小米','土豆'));
--查询
select * from x;
select * from table(select namelist from x where id=1);

3.3 变长数组

下标同样只能是数字类型,使用前需要初始化,和扩展。
变长数组类型在定义时,需要指定它的最大长度。
变长数组在扩展时,不能超过最大长度。
有最大长度限制的嵌套表, 编码上和嵌套表完全相同。

3.3.1 在PL/SQL中使用

3.3.1.1 语法

--创建语句:
type 类型名 is varray(最大长度) of 元素的数据类型;
--初始化:
变量名:=类型名();--初始化一个空的变长数组
变量名:=类型名(值1,值2);--初始化一个带元素的变长数组
--元素扩展:
变量名.extend(n);
--赋值:
变量名(n):=值;

3.3.1.2 案例

declaretype atype is varray(5) of varchar2(30);a atype;
begin--初始化a:=atype();--扩展a.extend(3);--添加数据a(1):='A';a(2):='B';a(3):='C';for i in a.first..a.last loopdbms_output.put_line(a(i));end loop;
end;

3.3.2 在数据库使用

3.3.2.1 创建语法

create type 类型名 is varray(长度) of 类型;

3.3.2.2 案例:查询emp表中工资排名第5位到第14位的姓名

create type atype1 is varray(10) of varchar2(30);
declarea atype1;
beginselect ename bulk collect into a from (select ename,row_number() over(order by sal desc nulls last)ranks from emp)where ranks between 5 and 14;for i in a.first..a.last loopdbms_output.put_line(a(i));end loop;
end;

3.3.3 在建表时使用

3.3.3.1 创建语法
create table 表名(
变量 类型,
变长数组列 变长数组类型
);
3.3.3.2 案例

create table z(id number(10),namelist atype1
)
----插入数据
insert into z(id,namelist) values(1,atype1('a','b','c','d'));
select * from table(select namelist from z where id=1);

Oracle数据库 Oracle集合相关推荐

  1. Oracle实例和Oracle数据库(Oracle体系结构)

    --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...

  2. empinfo Oracle数据库,Oracle数据库中相关技术详细操作

    1.Distinct消除重复行数据:SELECT DISTINCT DEPTNO FROM EMP 2.NULL操作 如果某条记录中有缺少的数据值,就是空值(NULL值).空值不等于0或者空格,空值是 ...

  3. oracle数据库系统介绍,Oracle数据库(Oracle Database)体系结构及基本组成介绍

    Oracle数据库服务器(Oracle database server)一般情况下是一个Oracle instance和一个Oracle database组成.当在计算机服务器上启动Oracle数据库 ...

  4. Oracle数据库--Oracle作业基础知识整合

    一.Oracle启动服务有哪些?说说它们各自的功能. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Ser ...

  5. 怎么全量备份oracle数据库,Oracle 数据库全量备份恢复和部分备份恢复 | 学步园...

    今天又遇到了Oracle数据库序列的问题,索性来个全库的备份和恢复.如下 imp/exp 方式 表模式备份: ­ oracle@sencloudServer: exp dhoffice/dhoffic ...

  6. 如何启动和关闭oracle数据库,Oracle数据库启动和关闭方式总结

    Oracle数据库启动和关闭的方法很多,下面就为您详细介绍几种常用的Oracle数据库启动和关闭方式,供您参考学习之用. 一.几种Oracle数据库启动方式: 1.startup nomount 非安 ...

  7. 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用

    重置办法如下:打开CMD命令提示符,然后输入下面命令进行重置: 输入sqlplus /nolog,回车 SQL> conn /as sysdba 已连接: SQL>alter user s ...

  8. empinfo Oracle数据库,Oracle数据库---包

    --根据员工号或员工姓名获取员工的信息 --根据员工号或员工姓名删除员工的信息 --创建包规范 CREATE OR REPLACE PACKAGE overload_pkg IS FUNCTION g ...

  9. 初次进入oracle数据库,Oracle数据库的初次使用

    oracle数据库的初次使用: oracle自带了用户 system /system管理员用户 scott/tiger用户 初次使用:创建表空间(此处为使用默认的用户scott/tiger) 在控制台 ...

  10. linux下imp导入oracle数据库,Oracle数据库Linux下的导入IMP

    和相关篇的EXP相对应的用了如下的导入方法. [oracle@localhost ~]$ imp Import: Release 11.2.0.1.0 - Production on Fri Sep ...

最新文章

  1. linux监测cpu 内存,Linux中CPU与内存性能监测.docx
  2. 迭代器(Iterator)遍历的两种方法(for和while)
  3. 车牌识别与计算机编程,基于计算机视觉的车牌字符识别技术的研究
  4. [ python ] 多态
  5. 必须掌握的Java基础知识(三)
  6. javaSocket编程TCP
  7. 最新勒索软件WannaCrypt病毒感染前后应对措施
  8. php nginx 伪静态规则,常见PHP程序的Nginx 伪静态规则
  9. FishEye Crucible分析
  10. hdu 4484 Hailstone HOTPO
  11. 在浏览器中聊天(msn.jabber or gtalk,yahoo,aol,icq,meebo)
  12. 数据分析中的漏斗模型
  13. It's not allowed to load an initial chunk on demand.问题处理
  14. OpenCV如何叠加大小不同的图片
  15. 纯js写的手机版古诗填空游戏
  16. 20170703总结
  17. 中国企业对软件人才利用的思考
  18. 2017--就业分享之IT校招现状和面试经历
  19. e2fsprogs交叉编译
  20. 太原科技大学2021计算机调剂,2021年太原科技大学机械工程研究生调剂信息

热门文章

  1. 绕过微软AD域的屏保壁纸组策略
  2. 玩转k8s(三)—— 运行应用
  3. 【每日新闻】 百度张亚勤:小公司不要做平台,应聚焦解决实际问题 | 工信部:确保取消流量“漫游”费7月1日如期兑现...
  4. 【纯开源uniapp】小程序APP网约车代驾顺风车货运货拉拉网约车司机入驻双端小程序包搭建
  5. python嵌套函数具体案例_python编程嵌套函数实例代码
  6. 你不知道的原型和原型链
  7. R语言使用keras包实现包含多个全连接层的二分类预测模型:在模型训练过程中动态可视化每个epoch后的loss值以及accuray值
  8. TranslateAnimation的onAnimationEnd(Animation animation)竟然在TranslateAnimation完成前执行
  9. 嵌入式为什么没有软件架构师?
  10. Linux服务器查看内存的指令