MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 数据库 / 正文

Oracle游标sql语句代码块的优化

2024-11-26 20:49 huorong 数据库 5 ℃ 0 评论

游标操作的优化:

-- 有一个表格,存储的是用户的名字,将emp表中所有的用户名转换成小写,再写入这个表格

create table ename_emp(

ename varchar2(50)

);

-- 下面这个游标的操作,需要 43s时间才能完成

declare

begin

for i in (select ename from emp_liebiao) loop

insert into ename_emp values(lower(i.ename));

commit;

end loop;

end;

-- 因为游标是以行为单位进行数据的操作的,所有游标的效率是比较慢的,而且游标需要消耗的内存也是比较多的,我们需要将游标以行进行操作的方式,修改成一次性操作所有数据的批量的方式。

批量操作在游标里面 叫做 bulk collect


第一步,创建一个表类型

type 表类型的名字 is table of 表名.列名%type;


第二步,将自己创建的表类型声明给一个变量

变量名 表类型的名字;


第三步,创建一个游标,读取某个查询的结果

cursor 游标名字 is select查询语句;


第四步,打开游标

open 游标名字;


第五步,捕获游标的数据,将内容给到表类型的变量进行保存

fetch 游标名字 bulk collect into 变量名字;


第六步,使用 forall 语句,对数据进行批量的操作

forall i in 变量.first .. 变量.last DML语句操作;


第七步,关闭游标

close 游标名字;

declare

-- 创建表类型

type biao is table of emp_liebiao.ename%type;

-- 声明变量

b biao;

-- 创建游标

cursor m is select ename from emp_liebiao;

begin

-- 打开游标

open m;

-- 将游标的内容批量的给到变量

fetch m bulk collect into b;

-- 使用forall批量修改数据

forall i in b.first .. b.last insert into ename_emp values(lower(b(i)));

commit;

-- 关闭游标

close m;

end;


练习:批量修改用户的编号,让编号+工资等级+部门,形成一个新的编号,存入下面的表格中,使用bulk collect来实现。

2000以下是C,2000-3000是B,3000以上是A

例如SMITH, 新编号应该是 7369_C_20


create table empno_emp(

empno varchar2(50)

);


declare

type biao is table of emp_liebiao%rowtype;

b biao;

cursor m is select * from emp_liebiao;

begin

open m;

fetch m bulk collect into b;

forall i in b.first..b.last

insert into empno_emp values(

b(i).empno||'_'||decode(sign(b(i).sal-2000)+sign(b(i).sal-3000),-2,'C',2,'A','B')||'_'||b(i).deptno

);

commit;

close m;

end;

Tags:oracle语句查询

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言