一,游标的概念与作用
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集
使用for循环遍历游标的好处:1.不用声明额外的变量,2.不用打开和关闭游标,3.写法简单。
CREATE OR REPLACE PROCEDURE P_AUTO_ACCOUNT(EXEC_DATE IN DATE) IS
/**
* 使用游标配合for多层循环遍历
*/
BEGIN
DECLARE
V_STATR_DATE VARCHAR2(30); -- 开始时间
V_END_DATE VARCHAR2(30); -- 结束时间
V_APP_ACCOUNT VARCHAR2(30); -- app账号
CURSOR C_USER IS --声明游标
SELECT T.*
FROM TAB_USER T
WHERE 1=1
AND nvl(T.IS_DELETED,0) = 0;
ROW_USER C_USER%ROWTYPE; --指定行指针
BEGIN
-- 开始时间
select to_char(EXEC_DATE-6,'yyyy-mm-dd') into V_STATR_DATE from dual;
-- 结束时间
select to_char(EXEC_DATE-5,'yyyyy-mm-dd') into V_END_DATE from dual;
-- 使用for循环游标
FOR ROW_USER IN C_USER LOOP
SELECT X.APP_ACCOUNT INTO V_APP_ACCOUNT
FROM DUAL
LEFT JOIN ( select T.ACCOUNT_CODE
from TAB_APP_ACCOUNT T
where 1=1 AND T.USER_ID = ROW_USER.USER_ID
AND nvl(T.IS_DELETED,0) = 0 ) X
ON 1=1;
-- 如果账号为空执行下一次循环
IF NVL(V_APP_ACCOUNT, '*') = '*' THEN
CONTINUE;
END IF;
-- 游标循环遍历下嵌套for循环
for ROW_USER_ROLE in ( SELECT T.* FROM TAB_USER_ROLE T
WHERE 1=1
AND T.CREATE_DATE between to_date(V_STATR_DATE,'yyyy-mm-dd') AND to_date(V_END_DATE,'yyyy-mm-dd')
AND nvl(T.IS_DELETED,0) = 0 AND T.USER_ID = ROW_USER.SITE_CODE
) LOOP
-- 对第二层循环数据进行操作
dbms_output.put_line(ROW_USER.USER_NAME || '-' || ROW_USER_ROLE.ROLE_ID);
END LOOP;
END LOOP;
END;
end P_AUTO_ACCOUNT;