集合

集合

一定义:

存放一组数据类型相同得数据(多条数据),由下标和值组成
一个下标对应一条数据
分类:索引表,嵌套表和变长数组

1.集合中的属性和方法

first:取集合中的第一个元素的下标
last:取集合中最后一个元素的下标
count:取集合中元素的个数
limit:取集合中最多能存放的元素个数
next(下标):取当前下标对应的下一个元素的下标
prior(下标):取当前下标对应的上一个元素的下标
extend(n[,ind]):扩展集合中的元素,n表示扩展的个数,ind表示集合中的元素下标
delete():删除集合中的元素

1.索引表

索引表:是plsql中的一个集合类型,只能在plsql代码块中使用,由下标和值组成下标可以是字符串,也可以是数字。(整数pls_integer/binary_integer)
type 类型名称 is table of 元素的数据类型,index by 下标数据类型
变量声名:
变量名 索引表类型名称;
索引表的使用:
变量名(下标)–取一个索引表中的值,按下标取
变量名(下标):=值 --给索引表添加一个元素

declare
   --定义了一个存放字符串类型的索引表,它的下标是字符串类型
   type ctype is table of varchar2(50) index by varchar2(30);
   --声名一个索引表变量
   c ctype;
begin
   c('a'):='SMITH'; --添加一个元素
   c('b'):='KING'; 
   c('c'):='SCOTT';
   c('d'):='tom';
   
   --打印索引表第1个元素的下标
   dbms_output.put_line('第1个元素的下标first:'||c.first);
   --打印索引表的最后一个元素的下标
   dbms_output.put_line('最后一个元素的下标last:'||c.last);
   --打印索引表中的元素个数
   dbms_output.put_line('元素个数count:'||c.count);
   
   --next方法:取下一个元素的下标,参数是元素下标
   dbms_output.put_line('取下一个元素的下标next(''b''):'||c.next('b'));
   --prior方法:取上一个元素的下标,参数是元素下标
   dbms_output.put_line('取上一个元素的下标prior(''b''):'||c.prior('b'));
   
   --打印集合中的元素值
   dbms_output.put_line('打印下标是b的元素的值c(''b'')'||c('b'));
   
   --把下标是b的元素值改为ORACLE
   c('b'):='ORACLE'; --修改元素值
   dbms_output.put_line('打印下标b的元素值:'||c('b'));
   
   --删除集合中的元素
   c.delete(); --删除元素
   --打印元素个数
   dbms_output.put_line(c.count);
end;

索引表的遍历:

declare
   --定义了一个存放字符串类型的索引表,它的下标是字符串类型
   type ctype is table of varchar2(50) index by varchar2(30);
   --声名一个索引表变量
   c ctype;
   --声名一个循环变量,循环变量的类型和索引表下标类型相同
   i varchar2(30);
begin
   c('a'):='SMITH'; --添加一个元素
   c('b'):='KING'; 
   c('c'):='SCOTT';
   c('d'):='tom';

   --给循环变量赋初始值,将第1个元素的下标赋值给循环变量
   i:=c.first;
   /***
   i=a
   第1次     打印c(i)=c(a)      i=c.last i=d 不成立       i=c.next(i)=b 
   第2次     打印c(i)=c(b)      ...................       i=c.next(i)=c.next(b)=c
   第3次     打印c(i)=c(c)      ...................       i=c.next(i)=c.next(c)=d
   第4次     打印c(i)=c(d)      i=d     条件成立退出循环
   
   */
   loop
     --打印集合中的元素值(循环体语句)
     dbms_output.put_line(c(i));
     --退出循环语句
     exit when i=c.last; --当前循环变量保存的下标和最后一个元素下标相同时退出
     --循环控制语句
     i:=c.next(i);
   end loop;  
end;

bulk collect into 语句:

它可以使用在select intofetch intoexecute immediate into 语句中
select 列名,... bulk collect into 集合遍历,.. from 表名 
fetch 游标 bulk collect into 集合变量,...
execute immediate 'sql语句' bulk collect into 集合变量;
加上bulk collect 之后,以上三个语句可以取出多条数据;
--注意:索引表用在bulk collect后时,下标只能是整数类型
```	sql
--select into 
declare
   --定义一个索引表类型
   type ctype is table of varchar2(30) index by pls_integer;
   --声名一个索引表变量
   c ctype;
begin
   --查询员工姓名
   select ename bulk collect into c from emp where deptno=&部门编号;
   --遍历索引表打印姓名
   for i in c.first..c.last loop
     dbms_output.put_line(c(i));
   end loop;
end;
--fetch into
declare
   --定义一个索引表类型
   type ctype is table of varchar2(30) index by pls_integer;
   --声名一个索引表变量
   c ctype;
   
   --定义一个游标
   cursor cur is select ename from emp where deptno=&部门编号;
begin
   --打开游标
   open cur;
   fetch cur bulk collect into c; --将游标中的所有数据一次性取出,放入集合变量中
   --关闭游标
   close cur;
   --遍历索引表打印姓名
   for i in c.first..c.last loop
     dbms_output.put_line(c(i));
   end loop;
end;

2.嵌套表:
也是一种集合类型,由下标和值组成,它的下标只能是连续的整数,嵌套表在借用前需要进行初始化和扩展(bulk collect 语句中除外)它可以在plsql代码块中使用,也可以创建到数据库中
语法:

	type 类型名称 is tale of 元素的数据类型

嵌套表的初始化语法:
嵌套表变量:=嵌套表类型();–初始化一个嵌套表对象(初始化空的嵌套表)
嵌套表变量:=嵌套表类型(元素…);一个初始化一个有元素的嵌套表
添加元素:
嵌套表变量.extend();

declare
   --定义一个嵌套表类型
   type ttype is table of varchar2(30);
   --声名一个变量
   t ttype;
begin
   --初始化嵌套表
   t:=ttype();--初始化一个空的嵌套表
   
   --扩展一个嵌套表元素
   t.extend(1);
   t(1):='SMITH';
   t.extend(1);
   t(2):='KING';
   dbms_output.put_line('打印元素个数:'||t.count);
   
   --遍历,并打印嵌套表变量中的元素值
   for i in t.first..t.last loop
     dbms_output.put_line(t(i));
   end loop;
   dbms_output.put_line(rpad('=',50,'='));
   --扩展5个元素,并给元素赋值
   t.extend(5,1);--表示将下标是1的元素值,复制到新扩展的嵌套表中
   dbms_output.put_line('打印元素个数:'||t.count);
   
   for i in t.first..t.last loop
     dbms_output.put_line(t(i));
   end loop;
end;
declare
   --定义一个嵌套表类型
   type ttype is table of varchar2(30);
   --声名一个变量
   t ttype;
begin
   --初始化嵌套表
   t:=ttype();--初始化一个空的嵌套表
   
   --扩展一个嵌套表元素
   t.extend(1);
   t(1):='SMITH';
   t.extend(1);
   t(2):='KING';
   dbms_output.put_line('打印元素个数:'||t.count);
   
   --遍历,并打印嵌套表变量中的元素值
   for i in t.first..t.last loop
     dbms_output.put_line(t(i));
   end loop;
   dbms_output.put_line(rpad('=',50,'='));
   --扩展5个元素,并给元素赋值
   t.extend(5,1);--表示将下标是1的元素值,复制到新扩展的嵌套表中
   dbms_output.put_line('打印元素个数:'||t.count);
   
   for i in t.first..t.last loop
     dbms_output.put_line(t(i));
   end loop;
end;

嵌套表也可以创建到数据库中:
create type 类型名称 is table of 数据类型 ;

create type mtype is table of varchar2(50);

declare
   v mtype;
begin
   select distinct job bulk collect into v from emp;
   --遍历嵌套表打印
   for i in v.first..v.last loop
     dbms_output.put_line(v(i));
   end loop;
end;

3.变长数组
变长数组:也是一个集合类型,定义是需要指定最多存放的数据条数,下标只能是连续的数字,使用前需要初始化,,添加元素前需要扩展(bulk collect中不需要)扩展的元素个数不能超过最大长度
类型定义语法:

type 类型名称 is varray(最大长度) of 数据类型;
declare
   --定义一个变长数组类型
   type atype is varray(8) of varchar2(50);
   --声名一个变量
   a atype;
begin
   --初始化一个变长数组
   a:=atype('plsql','python','html'); --初始化一个有三个元素的变长数组变量
   
   --打印变长数组的元素个数
   dbms_output.put_line(a.count);
   --打印变长数组的最大长度
   dbms_output.put_line(a.limit);
   
   --遍历
   for i in a.first..a.last loop
     dbms_output.put_line(a(i));
   end loop;
   
   --添加元素前需要扩展
   a.extend(1);
   a(4):='php';
   --遍历
   for i in a.first..a.last loop
     dbms_output.put_line(a(i));
   end loop;
end;

创建一个变长数组类型
create type atype is varray(10) of varchar2(50);

总结:

都是一种集合类型,可以存放一组数据类型相同的数据,由下标和值组成
索引表:下标可以是字符串或者数字,并且下标可以不连续,使用前不需要初始化和扩展,但是只能在plsql代码块中使用,长度不限制
嵌套表和变长数组类型可以作为存储过程或函数的参数
嵌套表:下标是连续的整数,使用前需要初始化和扩展,不仅可以在代码中使用,或创建到数据库中,但是它在定义时,必须指定最大长度

1)bulk collect 语句
2)批量绑定
语法:
forall 循环变量 in 集合.first…集合.last dml 语句;
forall批量绑定语句,只能使用集合变量上,它相当遍历集合,将集合中的值,传给dml语句

–定义一个索引表,保存员工信息

declare
  type itype is table of emp%rowtype index by pls_integer;
  --声名一个索引表变量,用来存放所有员工的信息
  c itype;
begin
  --查询所有员工的信息
  select * bulk collect into c from emp;
  --遍历索引表变量c,逐个给员工添加500工资
  for i in c.first..c.last loop
    --每循环一次解析一次sql语句
    update emp set sal=sal+500 where empno=c(i).empno;
    --update emp set sal=? where empno=?
  end loop;
end;

forall :只能针对集合类型,并且forall中包含dml语句,不能有其他语句,forall的执行效率高,
for:不仅可以遍历结婚,也可以遍历其他,(sql语句,游标等)for循环的循环体可以包含dml语句外其他语句
代码块中语句
1.从表中查询内容
1)仅查一条数据时;
select into
execute immediate into
execute immediate 和select into 的区别
2)查询多条数据时
for v in select 语句
游标
集合:select bulk collect into ,fetch bulk collect into ,execute immediate bulk collect into
2.对表进行dml操作时
1)直接使用dml语句
2)先将需要的数据查询出来,根据不同的条件进行逐个修改
3.字符串操作
1)字符串拼接
2)单引号问题;
间隔符问题:1)在每列后面拼接一个固定的间隔符,拼完之后,进行截取,
2)声明一个变量保存间隔符初始值为‘’,在每次使用完变量后,重新赋值间隔符数据类型的处理;数字类型,字符串,日期类型
3)字符串的查找和截取
‘2020-01-02 :14;:12:39’
只需要日期不需要时间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值