网站首页 > 数据库 / 正文
游标操作的优化:
-- 有一个表格,存储的是用户的名字,将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语句查询
猜你喜欢
- 2024-11-26 那些年我们踩过的语句创建oracle 12c cdb实例的坑
- 2024-11-26 Oracle脚本转和MySQL转换
- 2024-11-26 oracle修改数据自动更新数据修改时间
- 2024-11-26 Oracle中delete from 语句与truncate语句的区别
- 2024-11-26 oracle中where 子句和having子句中的区别介绍
- 2024-11-26 第8篇:Oracle注入漏洞绕waf的新语句
- 2024-11-26 sql语句超65535个绑定变量参数导致Oracle实例中止问题
- 2024-11-26 5 个免费的在线 SQL 数据库环境,比Navicat 香
- 2024-11-26 Oracle优化:sql语句的执行顺序
- 2024-11-26 Mysql\Sql server\Oracle三种数据库实现限制查询结果的语句