Oracle数据库 Oracle集合
文章目录
- 一、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集合相关推荐
- Oracle实例和Oracle数据库(Oracle体系结构)
--========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...
- empinfo Oracle数据库,Oracle数据库中相关技术详细操作
1.Distinct消除重复行数据:SELECT DISTINCT DEPTNO FROM EMP 2.NULL操作 如果某条记录中有缺少的数据值,就是空值(NULL值).空值不等于0或者空格,空值是 ...
- oracle数据库系统介绍,Oracle数据库(Oracle Database)体系结构及基本组成介绍
Oracle数据库服务器(Oracle database server)一般情况下是一个Oracle instance和一个Oracle database组成.当在计算机服务器上启动Oracle数据库 ...
- Oracle数据库--Oracle作业基础知识整合
一.Oracle启动服务有哪些?说说它们各自的功能. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Ser ...
- 怎么全量备份oracle数据库,Oracle 数据库全量备份恢复和部分备份恢复 | 学步园...
今天又遇到了Oracle数据库序列的问题,索性来个全库的备份和恢复.如下 imp/exp 方式 表模式备份: oracle@sencloudServer: exp dhoffice/dhoffic ...
- 如何启动和关闭oracle数据库,Oracle数据库启动和关闭方式总结
Oracle数据库启动和关闭的方法很多,下面就为您详细介绍几种常用的Oracle数据库启动和关闭方式,供您参考学习之用. 一.几种Oracle数据库启动方式: 1.startup nomount 非安 ...
- 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用
重置办法如下:打开CMD命令提示符,然后输入下面命令进行重置: 输入sqlplus /nolog,回车 SQL> conn /as sysdba 已连接: SQL>alter user s ...
- empinfo Oracle数据库,Oracle数据库---包
--根据员工号或员工姓名获取员工的信息 --根据员工号或员工姓名删除员工的信息 --创建包规范 CREATE OR REPLACE PACKAGE overload_pkg IS FUNCTION g ...
- 初次进入oracle数据库,Oracle数据库的初次使用
oracle数据库的初次使用: oracle自带了用户 system /system管理员用户 scott/tiger用户 初次使用:创建表空间(此处为使用默认的用户scott/tiger) 在控制台 ...
- linux下imp导入oracle数据库,Oracle数据库Linux下的导入IMP
和相关篇的EXP相对应的用了如下的导入方法. [oracle@localhost ~]$ imp Import: Release 11.2.0.1.0 - Production on Fri Sep ...
最新文章
- linux监测cpu 内存,Linux中CPU与内存性能监测.docx
- 迭代器(Iterator)遍历的两种方法(for和while)
- 车牌识别与计算机编程,基于计算机视觉的车牌字符识别技术的研究
- [ python ] 多态
- 必须掌握的Java基础知识(三)
- javaSocket编程TCP
- 最新勒索软件WannaCrypt病毒感染前后应对措施
- php nginx 伪静态规则,常见PHP程序的Nginx 伪静态规则
- FishEye Crucible分析
- hdu 4484 Hailstone HOTPO
- 在浏览器中聊天(msn.jabber or gtalk,yahoo,aol,icq,meebo)
- 数据分析中的漏斗模型
- It's not allowed to load an initial chunk on demand.问题处理
- OpenCV如何叠加大小不同的图片
- 纯js写的手机版古诗填空游戏
- 20170703总结
- 中国企业对软件人才利用的思考
- 2017--就业分享之IT校招现状和面试经历
- e2fsprogs交叉编译
- 太原科技大学2021计算机调剂,2021年太原科技大学机械工程研究生调剂信息
热门文章
- 绕过微软AD域的屏保壁纸组策略
- 玩转k8s(三)—— 运行应用
- 【每日新闻】 百度张亚勤:小公司不要做平台,应聚焦解决实际问题 | 工信部:确保取消流量“漫游”费7月1日如期兑现...
- 【纯开源uniapp】小程序APP网约车代驾顺风车货运货拉拉网约车司机入驻双端小程序包搭建
- python嵌套函数具体案例_python编程嵌套函数实例代码
- 你不知道的原型和原型链
- R语言使用keras包实现包含多个全连接层的二分类预测模型:在模型训练过程中动态可视化每个epoch后的loss值以及accuray值
- TranslateAnimation的onAnimationEnd(Animation animation)竟然在TranslateAnimation完成前执行
- 嵌入式为什么没有软件架构师?
- Linux服务器查看内存的指令