存过游标以及嵌套循环的联合使用
2018-03-22 14:10
309 查看
最近使用存储过程和游标的联合使用,由于有些生疏所以记录一下
存储过程游标书写如下:
CREATE OR REPLACE procedure SGKQ.SCHEDULE_RECORD_PRO is
/**
*
* 描述:查询员工时间段内连续五天及以上未打卡的员工信息,
查找出员工号,员工user_name,连续未打卡的最后日期,连续未打卡的天数
**/
--定义变量
v_numA number;--声明变量用于接收连续未打开天数
v_numB number;
v_record_count number;--声明变量用于接收查询的考勤条数
v_code varchar2(100);
v_username varchar2(200);
v_workdate varchar2(37);
v_workdate_temp varchar2(37);
--查询员工游标
CURSOR HAO_STAFF_CURSOR IS SELECT CODE,USER_NAME FROM HAO_STAFF WHERE EMPLOYEE_STATUS = '2'AND DEL_FLAG = '0' AND ORG_NAME LIKE '%商管集团-各区域公司%' and code NOT IN(10086);
--查询排班游标
CURSOR SCHEDULE_MANAGER_CURSOR IS SELECT STAFF_CODE ,WORK_DATE FROM SCHEDULE_MANAGER_DETAIL WHERE WORK_DATE<'20180320' AND WORK_DATE>'20180120' AND DEL_FLAG='0'and WORK_STATION NOT IN ('009') AND STAFF_CODE=v_code ORDER BY STAFF_CODE ,WORK_DATE ASC;
BEGIN
--解决控制台输出长度限制报错
DBMS_OUTPUT.ENABLE (buffer_size=>null);
--循环员工
FOR V_HAOSTAFF IN HAO_STAFF_CURSOR LOOP
v_numA := 0;
v_numB := 0;
v_code := V_HAOSTAFF."CODE";--把code赋值给v_code
v_username := V_HAOSTAFF."USER_NAME";
--循环排班
FOR V_SCHEDULE_MANAGER IN SCHEDULE_MANAGER_CURSOR LOOP
v_record_count := 0;
v_workdate := V_SCHEDULE_MANAGER.WORK_DATE;
--查询考勤(查询出来的条数通过into赋值给v_record_count)
SELECT COUNT(*) INTO v_record_count FROM DEV_RECORD WHERE TS_TIME <= to_date((select to_char(concat(v_workdate,' 23:59:59')) from DUAL), 'yyyy-MM-dd HH24:mi:ss') AND TS_TIME >= to_date((select to_char(concat(v_workdate,' 00:00:00')) from DUAL), 'yyyy-MM-dd HH24:mi:ss') AND SZ_UID=v_username;
IF v_rocord_count = 0 THEN
v_numA := v_numA+1;
IF v_numA >= 5 THEN
v_workdate_temp := v_workdate;
v_numB := v_numA;
END IF;
ELSE
v_numA := 0;
END IF;
END LOOP;
--保存五天缺勤人员信息
IF v_numB >= 5 THEN
--保存五天未打开的员工信息
INSERT INTO A_COUNT_ABSENCE_STAFF(STAFF_CODE,USER_NAME,WORK_DATE,SERIES_DATE_NUM) values(v_code,v_username,v_workdate_temp,v_numB);
COMMIT;
END IF;
END LOOP;
end SCHEDULE_RECORD_PRO;
通过实践,明白了存储过程和游标的联合使用,以后使用的会更加的得心应手!
存储过程游标书写如下:
CREATE OR REPLACE procedure SGKQ.SCHEDULE_RECORD_PRO is
/**
*
* 描述:查询员工时间段内连续五天及以上未打卡的员工信息,
查找出员工号,员工user_name,连续未打卡的最后日期,连续未打卡的天数
**/
--定义变量
v_numA number;--声明变量用于接收连续未打开天数
v_numB number;
v_record_count number;--声明变量用于接收查询的考勤条数
v_code varchar2(100);
v_username varchar2(200);
v_workdate varchar2(37);
v_workdate_temp varchar2(37);
--查询员工游标
CURSOR HAO_STAFF_CURSOR IS SELECT CODE,USER_NAME FROM HAO_STAFF WHERE EMPLOYEE_STATUS = '2'AND DEL_FLAG = '0' AND ORG_NAME LIKE '%商管集团-各区域公司%' and code NOT IN(10086);
--查询排班游标
CURSOR SCHEDULE_MANAGER_CURSOR IS SELECT STAFF_CODE ,WORK_DATE FROM SCHEDULE_MANAGER_DETAIL WHERE WORK_DATE<'20180320' AND WORK_DATE>'20180120' AND DEL_FLAG='0'and WORK_STATION NOT IN ('009') AND STAFF_CODE=v_code ORDER BY STAFF_CODE ,WORK_DATE ASC;
BEGIN
--解决控制台输出长度限制报错
DBMS_OUTPUT.ENABLE (buffer_size=>null);
--循环员工
FOR V_HAOSTAFF IN HAO_STAFF_CURSOR LOOP
v_numA := 0;
v_numB := 0;
v_code := V_HAOSTAFF."CODE";--把code赋值给v_code
v_username := V_HAOSTAFF."USER_NAME";
--循环排班
FOR V_SCHEDULE_MANAGER IN SCHEDULE_MANAGER_CURSOR LOOP
v_record_count := 0;
v_workdate := V_SCHEDULE_MANAGER.WORK_DATE;
--查询考勤(查询出来的条数通过into赋值给v_record_count)
SELECT COUNT(*) INTO v_record_count FROM DEV_RECORD WHERE TS_TIME <= to_date((select to_char(concat(v_workdate,' 23:59:59')) from DUAL), 'yyyy-MM-dd HH24:mi:ss') AND TS_TIME >= to_date((select to_char(concat(v_workdate,' 00:00:00')) from DUAL), 'yyyy-MM-dd HH24:mi:ss') AND SZ_UID=v_username;
IF v_rocord_count = 0 THEN
v_numA := v_numA+1;
IF v_numA >= 5 THEN
v_workdate_temp := v_workdate;
v_numB := v_numA;
END IF;
ELSE
v_numA := 0;
END IF;
END LOOP;
--保存五天缺勤人员信息
IF v_numB >= 5 THEN
--保存五天未打开的员工信息
INSERT INTO A_COUNT_ABSENCE_STAFF(STAFF_CODE,USER_NAME,WORK_DATE,SERIES_DATE_NUM) values(v_code,v_username,v_workdate_temp,v_numB);
COMMIT;
END IF;
END LOOP;
end SCHEDULE_RECORD_PRO;
通过实践,明白了存储过程和游标的联合使用,以后使用的会更加的得心应手!
相关文章推荐
- 在Python的while循环中使用else以及循环嵌套的用法
- Mysql存储过程循环内嵌套使用游标示例代码
- sql server 函数,存储过程,游标以及while和if语句的嵌套使用
- DB2 存储过程中游标循环的嵌套使用方法。
- 在Python的while循环中使用else以及循环嵌套的用法
- 关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)
- Mysql存储过程循环内嵌套使用游标示例
- Mysql存储过程循环内嵌套使用游标示例代码
- 嵌套循环的使用
- mysql游标循环的使用
- oracle 游标嵌套使用
- 使用游标在存储过程中循环遍历数据
- 微信小程序入门教程 - 列表渲染多层嵌套循环及wx:key的使用
- 命令行参数的使用、goto标签的使用以及for循环中局部变量声明问题
- mysql:游标嵌套使用
- 可以和unity联合使用game server以及game server的比较
- ios NSTimer引起的循环引用,以及NSTimer的使用
- SQL 嵌套游标的使用
- oracle 查看锁表状况以及游标的使用
- MySQL数据库中,使用游标循环遍历