ORACLE游标、递归查询、子查询与批量更新示例
2010-08-10 15:57
429 查看
--创建临时表
create table TJ_org_NEW
(
DEPTCODE NVARCHAR2(255),
ORGDESC NVARCHAR2(255),
ORGANTYPE NVARCHAR2(255),
LEVELFACT NUMBER(6),
PARENTDEPTCODE NVARCHAR2(255)
)
tablespace TEST
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
--初始化临时表数据
insert into TJ_ORG_NEW(DEPTCODE,ORGDESC,ORGANTYPE,LEVELFACT,PARENTDEPTCODE) select DEPTCODE,"ORG",ORGANTYPE,level,PARENTDEPTCODE from "TJ_org"
connect by prior DEPTCODE=PARENTDEPTCODE
start with PARENTDEPTCODE=1 order by level;
/*
使用游标实现数据的批量逻辑处理
*/
declare
VARUSERDEPTCODE VARCHAR(255); --定义与表字段相同类型
cursor mycursor is --定义游标
select userdeptcode from tj_user;
my_record mycursor%rowtype; --定义游标记录类型
Counter int :=0;
begin
open mycursor; --打开游标
if mycursor%isopen then --判断打开成功
loop --循环获取记录集
fetch mycursor into my_record; --获取游标中的记录
if mycursor%found then --游标的found属性判断是否有记录
--进行实际的业务处理Begin
if my_record.userdeptcode=90033751 then --网省一级用户更新
update tj_user set USERORGCODE=90033751 where userdeptcode=90033751;
dbms_output.put_line(my_record.userdeptcode||'A');
else --非网省一级用户更新
update tj_user set USERORGCODE=
(select DEPTCODE from (select DEPTCODE,ORGDESC,ORGANTYPE,PARENTDEPTCODE,Levelfact from TJ_ORG_NEW
connect by prior PARENTDEPTCODE=DEPTCODE
start with DEPTCODE=my_record.userdeptcode
order by Levelfact) where ORGANTYPE=1 and Levelfact=2)
where (userdeptcode<>90033751) and
(userdeptcode in (select DEPTCODE from TJ_ORG_NEW
connect by prior PARENTDEPTCODE=DEPTCODE
start with DEPTCODE=my_record.userdeptcode));
dbms_output.put_line(my_record.userdeptcode||'B');
end if;
--进行实际的业务处理End
else
exit;
end if;
end loop;
else
dbms_output.put_line('游标没有打开');
end if;
close mycursor;
end;
create table TJ_org_NEW
(
DEPTCODE NVARCHAR2(255),
ORGDESC NVARCHAR2(255),
ORGANTYPE NVARCHAR2(255),
LEVELFACT NUMBER(6),
PARENTDEPTCODE NVARCHAR2(255)
)
tablespace TEST
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
--初始化临时表数据
insert into TJ_ORG_NEW(DEPTCODE,ORGDESC,ORGANTYPE,LEVELFACT,PARENTDEPTCODE) select DEPTCODE,"ORG",ORGANTYPE,level,PARENTDEPTCODE from "TJ_org"
connect by prior DEPTCODE=PARENTDEPTCODE
start with PARENTDEPTCODE=1 order by level;
/*
使用游标实现数据的批量逻辑处理
*/
declare
VARUSERDEPTCODE VARCHAR(255); --定义与表字段相同类型
cursor mycursor is --定义游标
select userdeptcode from tj_user;
my_record mycursor%rowtype; --定义游标记录类型
Counter int :=0;
begin
open mycursor; --打开游标
if mycursor%isopen then --判断打开成功
loop --循环获取记录集
fetch mycursor into my_record; --获取游标中的记录
if mycursor%found then --游标的found属性判断是否有记录
--进行实际的业务处理Begin
if my_record.userdeptcode=90033751 then --网省一级用户更新
update tj_user set USERORGCODE=90033751 where userdeptcode=90033751;
dbms_output.put_line(my_record.userdeptcode||'A');
else --非网省一级用户更新
update tj_user set USERORGCODE=
(select DEPTCODE from (select DEPTCODE,ORGDESC,ORGANTYPE,PARENTDEPTCODE,Levelfact from TJ_ORG_NEW
connect by prior PARENTDEPTCODE=DEPTCODE
start with DEPTCODE=my_record.userdeptcode
order by Levelfact) where ORGANTYPE=1 and Levelfact=2)
where (userdeptcode<>90033751) and
(userdeptcode in (select DEPTCODE from TJ_ORG_NEW
connect by prior PARENTDEPTCODE=DEPTCODE
start with DEPTCODE=my_record.userdeptcode));
dbms_output.put_line(my_record.userdeptcode||'B');
end if;
--进行实际的业务处理End
else
exit;
end if;
end loop;
else
dbms_output.put_line('游标没有打开');
end if;
close mycursor;
end;
相关文章推荐
- ORACLE游标、递归查询、子查询与批量更新示例
- Oracle批量查询、删除、更新使用BULK COLLECT提高效率
- Oracle + Mybatis实现批量插入、更新和删除示例代码
- sqlserver移植为Oracle笔记(更新,新增字段名;批量新增记录;日期查询;截取字串函数)
- 『ORACLE』查询被锁的对象和批量杀会话(11g)
- 对于oracle进行简单树查询(递归查询)
- 对于oracle进行简单树查询(递归查询)
- Oracle游标简单示例
- Berkeley DB 批量插入更新与删除用法示例
- oracle 批量更新
- oracle mybatis 批量更新
- C#连接Oracle查询更新数据
- mysql 跨表查询、更新、删除示例
- Oracle 数据库已更新 页面查询结果未更新原因。
- sql server 2000使用游标和随机查询的脚本示例
- oracle下常用查询更新命令(身份证号判断男女,更新语句多表查询)
- oracle查询重复数据和删除重复记录示例分享
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- Oracle case when 查询和更新(不积跬步,无以至千里)
- Mybatis中实现oracle的批量插入、更新