-- Created on 2018/10/12 by 32580
declare
-- 定义变量 变量赋值方式为: 变量名 := 值
i INTEGER ;
sqls varchar2(500);
user_id varchar2(36);
log_id varchar2(36);
cdate date; -- 本次创建时间
fdate date; -- 山慈创建时间
edate date; -- 本次推出时间
-- logs SYS_LOG%ROWTYPE;
-- 下面为定义游标 这种方式为简版
-- cursor 关键词 游标名 [可选 游标形参 游标类型] is select * from table --is 后面跟随一个查询语句 这样就可以定义一个玩着的游标了
cursor log_user is select log.CREATE_BY from sys_log_bak log where 1=1 and log.title in ('法官系统登录', '系统登录') and log.CREATE_BY = '213516324' group by log.CREATE_BY ;
cursor sel_sg(cid varchar2) is select log.* from sys_log_bak log where log.TITLE in ('法官系统登录', '系统登录') and log.CREATE_BY = cid order by log.CREATE_DATE desc ;
begin
-- Test statements here
i := 0;
-- sqls := 'select log.id from sys_log_bak log where log.TITLE in (''法官系统登录'', ''系统登录'') and log.CREATE_BY = :s order by log.CREATE_DATE asc ';
-- 定义一个sql 语句 语句中还有单引号(常量), 便用两个单引号 如果需要占位符 便用 ':' 顿号 + 字符 (字符可随意),
-- execute IMMEDIATE sqls into log_id using user_id
-- 执行存储过程中的sql语句 execute immediate (关键词) sqls (sql语句) into log_id (变量) 用于存储当前查询到的值,可以为多个,用 ',' 隔开, using 后面跟 需要插入占位符中的值. 按照占位符先后顺序
-- 但 这种执行的语句,只能返回单行, 多行便会报错. 如果需要多行,需要使用游标
for us in log_user loop -- log_user 为游标, 循环会自动打开游标 us为临时变量名,自己任意起
--Dbms_Output.put_line(temp.create_date); --输出某个字段,使用"变量名.列名"即可。
cdate := null;
fdate := null;
Dbms_Output.put_line(us.CREATE_BY);
for row_s in sel_sg(us.CREATE_BY) loop
log_id := row_s.id;
cdate := row_s.CREATE_DATE;
if fdate is null then -- 第一次 登录
edate := cdate + 2/24;
elsif (cdate - fdate) >= 2/24 then -- 2小时
edate := cdate + 2/24;
elsif (cdate - fdate) >= 1/24 then -- 1
edate := cdate + 1/24;
elsif (cdate - fdate) < 1/24 and (cdate - fdate) >= 30/(24*60) then -- 半个小时
edate := cdate + 30/(24*60);
elsif (cdate - fdate) < 30/(24 * 60) and (cdate - fdate) >= 10/(24 * 60) then --10分钟
edate := cdate + 10/(24*60);
elsif (cdate - fdate) < 10/(24 * 60) and (cdate - fdate) >= 1/(24 * 60) then --1分钟
edate := fdate - 1/(24*60);
elsif (cdate - fdate) < 1/(24 * 60) then
edate := fdate - 2/(24*60*60);
end if;
fdate := row_s.CREATE_DATE;
EXECUTE IMMEDIATE ' update sys_log_bak bak set bak.EXIT_DATE = :d where bak.ID = :c ' using edate , log_id ;
commit;
end loop;
end loop;
end;
Oracle 存储过程 \ 游标简单定义和使用
猜你喜欢
转载自blog.csdn.net/qq_36561501/article/details/83038362
今日推荐
周排行