PLSQL获取用户锁并解锁

这篇博客介绍了如何在Oracle数据库中通过PLSQL创建过程来检查并记录被锁定的会话信息。首先,创建了一个名为T_LOCKED_SESSION的表用于存储锁信息,然后创建了p_check_locked_session过程查询锁并插入数据。此外,还提供了p_exec_job过程来定期执行这个查询,并通过dbms_job提交此任务作为JOB。最后,展示了如何通过SQL查询来杀死锁定的会话。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- --创建表用来存储check到的锁信息


create table T_LOCKED_SESSION
(
  sid           VARCHAR2(100),
  serialno      VARCHAR2(100),
  eventno       VARCHAR2(100),
  event         VARCHAR2(100),
  module        VARCHAR2(100),
  username      VARCHAR2(100),
  osuser        VARCHAR2(100),
  prevexecstart VARCHAR2(100),
  sqlid    VARCHAR2(100),
  lockedmode   VARCHAR2(100),
  action  VARCHAR2(100),
  inserttime  VARCHAR2(100)
)
tablespace EGROUP_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    next 8
    minextents 1
    maxextents unlimited
    pctincrease 0
  );

 

 

---创建过程用来查询锁并将锁数据插入到前面表中

create or replace procedure p_check_locked_session
is
  v_count  varchar2(100);
  v_sid varchar2(100);
  v_serialNo varchar2(100);
  v_event_no varchar2(100);
  v_event  varchar2(100);
  v_module varchar2(100);
  v_username varchar2(100);
  v_osuser varchar2(100);
  v_sql_id varchar2(100);
  v_locked_mode varchar2(100);
  v_action varchar2(100);
  v_prev_exec_start v$session.prev_exec_start%type;
  CURSOR cursor_session_info is     --- 定义游标变量,通过锁定对象视图和会话视图来获取相应的锁信息
  select sid,serial#,event#,event,module,username,OSUSER,prev_exec_start,sql_id,locked_mode,action from v$locked_object t1,v$session t2
  where t2.username is not null and t1.session_id=t2.sid  order by prev_exec_start, sid;

 

begin     --- 将游标数据一条条插入自建的表中,并在插入一条记录前和自荐表进行对比,检查该记录的sessionID在自建表中是否存在,若不存在则插入
 open cursor_session_info;
  loop fetch cursor_session_info into v_sid,v_serialNo,v_event_no,v_event,
  v_module,v_username,v_osuser,v_prev_exec_start,v_sql_id,v_locked_mode,v_action;
    exit when cursor_session_info%notfound;
    select count(sid) into v_count from t_locked_session where sid = v_sid;
    if v_count = 0 then
     insert into t_locked_session(sid,serialNo,eventNo,event,module,username,osuser,prevExecStart,sqlid,lockedmode,action,inserttime)
     values
     (v_sid,v_serialNo,v_event_no,v_event,v_module,v_username,v_osuser,to_char(v_prev_exec_start,'yyyy/mm/dd hh24:mi:ss'),v_sql_id,v_locked_mode,v_action,to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'));
    end if;
   end loop;
  commit;
    close cursor_session_info;
end p_check_locked_session;

 

/

 

---创建过程用来确认查询锁的过程是否放入JOB中,若没,则创建该JOB

create or replace procedure p_exec_job
is
  job_num NUMBER;
  v_count integer;
begin
  select count(*) into v_count from user_jobs where what='p_check_locked_session;';
  if v_count = 0 then
      sys.dbms_job.submit(job =>job_num,
                      what =>'p_check_locked_session;',
                      next_date =>to_date('07-12-2010 16:07:42', 'dd-mm-yyyy hh24:mi:ss'),
                      interval =>'sysdate+30/1440',no_parse=>false);
  commit;
  end if;

  select JOB INTO job_num from user_jobs where what='p_check_locked_session;' and rownum=1;
  if job_num > 0 then
    dbms_job.run(job_num);
  end if;
end;
/

execute p_exec_job();

 


select 'alter system kill session '||chr(39)||t2.sid||','||t2.serial#||chr(39)||';'
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值