21. oracle游标循环例子
事例1:
create or replace procedure sp_addProjectQj(
ret out number,
flowid in number --流程Id
)
as
cursor c_design is
select * from LC_VR_Detail where lc_crm_visitreport_Id = flowid and dd_status != 2;
c_row c_design%rowtype;
v_id number;
begin
for c_row in c_design loop
pnextid('T_XMSJQJ',v_id);
--项目涉及器件(id,项目名称,器件) values --design明细表(v_id,项目名称,器件名称)
insert into T_XMSJQJ(id,f2,sj,fqj,f3,cj,fsl,fbz,fqzje,fldknx,fldjz,fcyyy,fdocnum,fgdyy,f6,bz)
values (v_id,c_row.dd_project,c_row.DD_Newtime,c_row.dd_name,c_row.dd_model,c_row.dd_brand,
c_row.dd_num,c_row.dd_currency,c_row.dd_HideCash,c_row.DD_SureChance,c_row.DD_SureEvolve,
c_row.DD_Difference,c_row.dd_docnum,c_row.dd_whyclose,c_row.dd_Designinstatus,c_row.dd_remarks );
commit;
end loop;
ret:=1;
EXCEPTION
WHEN OTHERS THEN
ret:=-1;
end;
事例2:
CREATE OR REPLACE PROCEDURE sp_empAttendSetAdd (
o_Ret out int,
o_RetInfo out varchar2,
i_type in int, --类别:1|部门;2|员工;3|角色
i_company int,--公司
i_deptEmpRole in varchar2, --部门或员工或角色
i_validDate date,--生效日期
i_invalidDate date,--失效日期
i_user int, --登录用户
i_attendTeam int --考勤班组
)
is
v_nextid number;
v_worktype number;
v_invalidDate date;
v_sql varchar2(5000);
v_strSql varchar2(5000);
cur_data types.cursorType;
v_employeeId number;
v_deptId number;
v_flag1 number;
v_flag2 number;
begin
v_invalidDate:=i_invalidDate;
--失效日期为空时,取当前年份的年底时间
if i_invalidDate is null then
--select add_months(trunc(i_validDate, 'yyyy'), 12)-1 into v_invalidDate from dual;
select max(a.fenddate) into v_invalidDate from HRM_AttendPeriod a where a.fcompany = i_company;
end if;
--判断生效时间至失效时间是否有未开账的考核期间
select count(1) into v_flag1 from Hrm_Attendperiod a where a.fbegindate<=i_validDate and i_validDate<=a.fenddate and a.fcompany = i_company;
select count(1) into v_flag2 from Hrm_Attendperiod a where a.fbegindate<=nvl(i_invalidDate,v_invalidDate) and nvl(i_invalidDate,v_invalidDate)<=a.fenddate and a.fcompany = i_company;
if v_flag1=0 or v_flag2=0 then
o_Ret:=-1;
o_RetInfo:='该生效时间段存在考勤期间未开账!';
return;
end if;
--查找工作种类
select fworktype into v_worktype from HRM_AttendTeam where id = i_attendTeam;
--类别是部门
if i_type=1 then
v_sql:=' instr('';''||'''||i_deptEmpRole||'''||'';'','';''||a.fdept||'';'')>0';
--类别是员工
elsif i_type=2 then
v_sql:=' instr('';''||'''||i_deptEmpRole||'''||'';'','';''||a.id||'';'')>0';
--类别是角色
elsif i_type=3 then
v_sql:=' a.id in ( select femployee from tuser where id in (select distinct userid from lbmember where
instr('';''||'''||i_deptEmpRole||'''||'';'','';''||roleid||'';'')>0
and orgid in (select id from lbOrganization where fun_findComOrgId(ID)='''||i_company||''')))';
end if;
v_strSql:= 'select a.id,a.fdept from PUB_Employee a where '||v_sql;
--dbms_output.put_line(v_strSql);
open cur_data for v_strSql;
loop
fetch cur_data into v_employeeId,v_deptId;
exit when cur_data%notfound;
--生效时间段交叉检查
sp_HRM_EmpAttendSet(o_Ret,o_RetInfo,i_company,v_employeeId,i_validDate,i_invalidDate);
if o_Ret<0 then
return;
end if;
pnextid('HRM_EmpAttendSet',v_nextid);
--新增员工考勤设置
insert into HRM_EmpAttendSet(id,Fcompany,Fdept,Femployee,Fattendteam,Fcard,Fvaliddate,Finvaliddate,Fuser,Ftime)
values(v_nextid,i_company,v_deptId,v_employeeId,i_attendTeam,1,i_validDate,i_invalidDate,i_user,sysdate);
commit;
for cs_attendPeriod in (
--查询考勤期间
select a.id from HRM_AttendPeriod a where a.fbegindate between i_validDate and nvl(i_invalidDate,v_invalidDate)
)
loop
sp_HRM_WorkDuty(o_Ret,o_RetInfo,1,'批量新增员工考勤设置自动完成排班',i_user,cs_attendPeriod.id,v_worktype,v_employeeId);
--add By kaixian.zheng
sp_HRM_WorkDuty_Temp(o_Ret,o_RetInfo,1,'批量新增员工考勤设置自动完成排班',i_user,cs_attendPeriod.id,v_worktype,v_employeeId);
if o_Ret<0 then
return;
end if;
commit;
end loop;
commit;
end loop;
close cur_data;
end sp_empAttendSetAdd;
21. oracle游标循环例子的更多相关文章
- oracle游标循环的嵌套
完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦) 存储过程见下: -- Created on 2012/3/14 by FREE decla ...
- Oracle游标-循环查询表中数据(表名),并执行
Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount ); --定义一个游标变量 curs ...
- Oracle游标循环更新数据案例
declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZ ...
- oracle for loop循环以及游标循环
1. for in loop形式 DECLARE CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...
- oracle 游标使用大全
转:http://www.cnblogs.com/fjfzhkb/archive/2007/09/12/891031.html oracle的游标和例子! 游标-----内存中的一块区域,存放的是se ...
- oracle存储过程的例子
oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...
- Oracle游标介绍
Oracle游标使用详解: 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标.要在程序中使用游标,必须 ...
- [转载]oracle游标概念讲解
原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标? ①从表中检索出结果集,从中每次指向一条记录进行交互 ...
- Oracle 游标使用总结(好文章)
游标(CURSOR)也叫光标,在关系数据库中经常使用,在PL/SQL程序中可以用CURSOR与SELECT一起对表或者视图中的数据进行查询并逐行读取. Oracle游标分为显示游标和隐式游标. 显示游 ...
随机推荐
- com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 问题解决方法
一.问题 今天用mybatis连接数据库时出现了如下错误: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The serve ...
- (转)C++ 容器及选用总结
目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...
- js 数组方法比较
js 数组方法比较 table th:first-of-type { width: 80px; } table th:nth-of-type(2) { width: 120px; } table th ...
- Linux elasticsearch 安装 遇到的问题
备注:我的 Linux 测试机 是2G 内存的 ,估计内存小于 我的内存肯定会出这个问题 .(安装的最新版6.3.2) 1. 下载文件 解压 2 .试着 运行 bin 下面的 elasticse ...
- sed 给文件每行末尾追加相同字符
给文件file1每行末尾追加字符 ; sed 's/$/;/' file1
- centos yum安装PHP5.5,5.6,7.0
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案:1.检查当前安装的PHP包yum list installed | grep php如果有安装的PHP包,先删除他们 yum ...
- http常用状态码说明
HTTP状态码:每发出一个http请求之后,就会有一个响应,http本身会有一个状态码,来标示这个请求是否成功,常见状态码: 200,2开头的都表示这个请求发送成功,最常见的就是200 300,3开头 ...
- golang 多个routine之间的同步
本文以一个例子的方式介绍channel在同步中的使用. 下面的例子中,主task首先阻塞,直到两个task完成后,再继续执行. package main import ( "log" ...
- JZ2440 裸机驱动 第14章 ADC和触摸屏接口
本章目标: 了解S3C2410/S3C2440和触摸屏的结构: 了解电阻触摸屏的工作原理和等效电路图: 了解S3C2410/S3C2440触摸屏控制器的多种工作模式: ...
- HighCharts定时刷新图表
假设图表容器的id为exChart,如下: <div style="height:450px;" id="chart"> 1. 首先在serie ...