oracle集合

oracle集合

1初识集合

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

集合组成

下标组成
下标的类型包含数字(整数,pls_integer,binary_integer)和字符串
值的类型可以是数据库中的所有类型(基本数据类型,记录类型(record,%rowtype),%type,集合类型)

集合三种类型

集合是一个比较广义的概念,在pl/sql中提供了3中类型的集合

索引表

  • 可以通过数字或字符串作为下标来查找其中的元素,仅在pl/sql中使用

嵌套表

  • 拥有索引表的所有特性,但是下标只能是数字类型(连续的整数)
  • 可以在plsql中使用也可以在数据库中使用

变长数组

  • 下标只能是数字类型,创建时需要指定最大长度
  • 可以在plsql中使用也可以在数据库中使用

2索引表类型

2.1语法

定义一个索引表类型
type 类型名称 is table of 元素值的数据类型 index by 下标的数据类型;

索引变量的声明
变量名 类型名;

索引变量的使用
变量名(下标);

2.2简单使用

declare
  --定义一个索引表类型
  type itype is table of varchar2(30) index by pls_integer;
  --声明一个集合变量
  ind itype;
begin
  ind(1):='张三';
  ind(4):='李四';
  dbms_output.put_line(ind(4)||','||ind(1));
end;

输出

李四,张三

3集合的属性或方法

3.1属性或方法简单汇总

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

3.2属性或方法示例

declare
  --定义一个集合类型
  type itype is table of varchar2(30) index by varchar2(30);
  --声明一个索引表
  eng itype;
begin
  --给索引表赋值
  eng('a'):='张三';
  eng('b'):='李四';
  eng('c'):='王五';
  eng('d'):='赵六';
  --打印集合中第一个元素的下标
  dbms_output.put_line('第一个元素的下标: '||eng.first);
  --打印集合中最后一个一个元素的下标
  dbms_output.put_line('最后一个元素的下标: '||eng.last);
  --打印集合中第二个元素的下标
  dbms_output.put_line('第二个元素的下标: '||eng.next(eng.first));
  --打印集合中倒数第二个元素的下标
  dbms_output.put_line('倒数第二个元素的下标: '||eng.prior(eng.last));
  --打印集合中元素的个数
  dbms_output.put_line('元素个数: '||eng.count);
end;

输出

第一个元素的下标: a
最后一个元素的下标: d
第二个元素的下标: b
倒数第二个元素的下标: c
元素个数: 4

declare
  --定义一个集合类型
  type itype is table of varchar2(30) index by varchar2(10);
  --定义一个变量保存集合的下标
  v_ind varchar(10);
  --声明一个索引表
  eng itype;
begin
  --给索引赋值
  eng('a'):='张三';
  eng('b'):='李四';
  eng('c'):='王五';
  eng('d'):='赵六';

  --遍历打印集合中的元素
  --将第一个元素的下标放入变量v_ind中
  v_ind:=eng.first;
  loop
    --打印集合元素
    dbms_output.put_line(eng(v_ind));
    --判断退出条件,当下标的值等于最后一个下标的值
    exit when v_ind=eng.last;
    --循环控制语句
    v_ind:=eng.next(v_ind);
  end loop;
end;

输出:

张三
李四
王五
赵六

4bulk collect语句循环遍历

集合提供了bulk collect语句获取表中数据
通过bulk colleck语句存入集合中的元素下标从1开始并且是连续的

注意:集合下标必须数字类型

4.1语法1

select 列.. bulk collect into 集合变量 from 表 where条件

获取emp表中30部门中的员工号和姓名

declare
  --定义索引表集合存储emp表中empno和ename
  type 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
  --bull collect语句获取empno和ename
  select empno,ename bulk collect into eno,eme from emp where deptno=30;
  for i in eno.first..eno.last loop
    dbms_output.put_line(eno(i)||eme(i));
  end loop;
end;

输出

7499ALLEN
7521WARD
7654MARTIN
7698BLAKE
7844TURNER
7900JAMES

4.2语法2

execute immediate ‘select语句‘ bulk collect into 集合变量

获取emp表中30部门中的员工号和姓名

declare
  --声明一个变量存放selqct查询结果
  v_sql varchar2(255);
  --定义索引表集合存储emp表中empno和ename
  type 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_sql
  v_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 loop
    dbms_output.put_line(eno(i)||eme(i));
  end loop;
end;

输出

7499ALLEN
7521WARD
7654MARTIN
7698BLAKE
7844TURNER
7900JAMES

4.3语法3

fetch 游标 bulk collect into 集合变量

获取emp表中30部门中的员工号和姓名

declare
  --声明一个游标
  cursor cur is select empno,ename from emp where deptno=30;
  --声明集合,存放empno和ename
  type 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 cur;
  --bulk collect语句,将cur查询到的结果放到eno和eme中
  fetch cur bulk collect into eno,eme;
  --关闭游标
  close cur;

  --循环打印出eno和eme集合中的所有数据
  for i in eno.first..eno.last loop
    dbms_output.put_line(eno(i)||','||eme(i));
  end loop;
end;

输出

7499,ALLEN
7521,WARD
7654,MARTIN
7698,BLAKE
7844,TURNER
7900,JAMES

原文地址:https://www.cnblogs.com/inmeditation/p/12070424.html

时间: 2024-10-28 17:33:41

oracle集合的相关文章

Oracle集合操作函数:union、intersect、minus

[转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符具有以下注意事项: 集合操作符不适用于LOB.VARRAY和嵌套表列. UNION.INTERSECT.MINUS操作符不使用于 LONG列. 如果选择列表中包含有表达式或者函数,那么必须为表达式或者函数定义列别名. 1.U

oracle 集合变量以及自定义异常的用法

oracle 集合变量以及自定义异常的用法, 在过程 record_practice 有record变量和自定义异常的用法实例.具体在3284行. 1 CREATE OR REPLACE Package Pkg_Weiyl Is 2 Pkg_Name Constant Varchar2(20) := 'pkg_weiyl'; 3 Too_Young Constant Number := -20001; 4 Exc_Too_Young Exception; 5 Pragma Exception_I

Oracle集合操作

集合关键字: 1.UNION:并集,所有的内容都查询,重复的显示一次,默认进行升序排序: 2.UNIONALL:并集,所有的内容都显示,包括重复的,展示内容没有排序: 3.INTERSECT:交集,只显示多个查询中相同的元素部分: 4.MINUS:差集,显示第一个查询中有,第二个查询中没有的元素 例子: 在scott用户下,创建表emp2,该表只包含emp中20部门员工的信息: 代码:create table emp2 as select * fromemp where deptno=20; 先

IT忍者神龟之oracle 集合的使用

每组查询均能得到其结果集,若需将多个查询结果合并成一个结果集,则可利用集合运算来实现. 如并集(UNION).并集且不去除重复行(UNOIN  ALL).交集(INTERSECT).差集(MINUS). 集合命令的目的是将两个(含以上)SQL语句产生的结果合并.由于需要将两个(含以上)数据集合并 因此字段数量必须相等,且类型也必须兼容.如果字段数量无法相同,可以将不足部分以NULL值取代, 以使其字段数量符合要求. 新建两张表并插入数据进行测试: [sql] view plaincopy cre

Oracle 集合操作

在 Oracle 中提供了三种类型集合操作:并(UNION).交(INTERSECT).差(MINUS) · UNION:将多个查询的结果组合到一个查询结果之中,没有重复内容 · UNION ALL:也是将多个查询结果组合到一个查询之中,但是包含重复值 · INTERSECT:返回多个查询结果中相同的部分 · MINUS:返回两个查询结果的差集

【转】Oracle集合操作函数:union、intersect、minus

集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符具有以下注意事项: 集合操作符不适用于LOB.VARRAY和嵌套表列. UNION.INTERSECT.MINUS操作符不使用于 LONG列. 如果选择列表中包含有表达式或者函数,那么必须为表达式或者函数定义列别名. 1.UNION (无重并集):当执行UNION 时,自动去掉结果集中的重复行,并以

Oracle 集合

--合并(UNION.UNION ALL) select * from empwhere ename like '%A%'unionselect * from empwhere ename like '%M%' UNION ALL不会取消重复和排序 --和合并效果一样 select * from empwhere ename like '%A%' or ename like '%M%' select * from empwhere ename like '%A%'union allselect

oracle 集合运算

集合运算就是将两个或者多个结果集组合成为一个结果集.集合运算包括: INTERSECT(交集),返回两个查询共有的记录. UNION ALL(并集),返回各个查询的所有记录,包括重复记录. UNION(并集),返回各个查询的所有记录,不包括重复记录. MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录. 当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以不同. 代码演示:查询出dept表中哪个部门下没有员工.只需求出dept表中的部门

oracle 集合运算符

UNION/UNION ALL 并集 INTERSECT 交集 MINUS 差集 我们知道group by 增强中 http://www.cnblogs.com/liuwt365/p/4181256.html group by rollup(a,b) = group by a,b + group by a + group by null 所以我们应该写sql语句应该为: 1 SQL> select deptno,job,sum(sal) from emp group by deptno,job