Oracle 存储过程 \ 游标简单定义和使用



-- 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;

猜你喜欢

转载自blog.csdn.net/qq_36561501/article/details/83038362