增加异常处理

CREATE OR REPLACE PROCEDURE SOLVE_LOCK

AS

V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句
V_SQL02 VARCHAR2(3000);

KILL_SID NUMBER;
KILL_SERIAL NUMBER;

CUR_LOCK SYS_REFCURSOR; --定义游标变量,循环执行抓取锁的sql语句
CUR_LOCK02 SYS_REFCURSOR;

TYPE TP_LOCK IS RECORD( --定义 record类型的 变量
V_SID NUMBER,
V_TYPE VARCHAR2(10),
V_ID1 NUMBER,
V_ID2 NUMBER,
V_LMODE VARCHAR2(200),
V_REQUEST VARCHAR2(200),
V_LOCK_TIME NUMBER,
V_BLOCK NUMBER );
RECORDS_LOCK TP_LOCK;

TYPE TP_LOCK02 IS RECORD(
WAITING_SID NUMBER,
WAITING_SQL VARCHAR2(1000),
BLOCKER_EVENT VARCHAR2(1000),
BLOCKING_SID NUMBER,
BLOCKING_SQL VARCHAR2(1000));
RECORDS_LOCK02 TP_LOCK02;

V_BLOCKING_SID NUMBER;
V_WAITING_SID NUMBER;

BEGIN
 
DBMS_OUTPUT.PUT_LINE('------------------查找数据库中是否有锁阻塞、锁等待的情况------------------');
V_SQL:='SELECT SID,TYPE,ID1,ID2,
DECODE(LMODE,0, ''NONE'',1,''NULL'', 2, ''ROW SHARE'' ,3, ''ROW EXCLUSIVE'' ,4, ''SHARE'' ,5, ''SHARE ROW EXCLUSIVE'' ,6 ,''EXCLUSIVE'' ,''HAHA'') LOCK_TYPE,
DECODE(REQUEST,0, ''NONE'',1,''NULL'', 2, ''ROW SHARE'' ,3, ''ROW EXCLUSIVE'' ,4, ''SHARE'' ,5, ''SHARE ROW EXCLUSIVE'' ,6 ,''EXCLUSIVE'' ,''HAHA'') LOCK_REQUEST,
CTIME,BLOCK FROM V$LOCK WHERE TYPE IN (''TM'',''TX'')' ;

OPEN CUR_LOCK FOR V_SQL;
LOOP
FETCH CUR_LOCK INTO RECORDS_LOCK;
EXIT WHEN CUR_LOCK%NOTFOUND;

IF RECORDS_LOCK.V_REQUEST <> 'NONE' THEN --抓取发出请求锁的会话
DBMS_OUTPUT.PUT_LINE('waiting sid: '||RECORDS_LOCK.V_SID||' is request a lock ,lock_mode is '||RECORDS_LOCK.V_REQUEST||' and being locked '|| RECORDS_LOCK.V_LOCK_TIME||'s');
V_WAITING_SID:=RECORDS_LOCK.V_SID;
END IF;

IF RECORDS_LOCK.V_BLOCK <> 0 THEN --抓取发生锁阻塞的会话
DBMS_OUTPUT.put_line('blocking sid: '||RECORDS_LOCK.V_SID||' is make a lock , lock_mode is '||RECORDS_LOCK.V_LMODE);
V_BLOCKING_SID:=RECORDS_LOCK.V_SID;
END IF;

END LOOP;
CLOSE CUR_LOCK;

DBMS_OUTPUT.PUT_LINE('------------------查找产生锁的会话、锁等待的会话------------------------');
V_SQL02:='SELECT DISTINCT WAITER.SID "WAITING_SID",W_SQL.SQL_TEXT "SQL FROM WAITING SESSION",BLOCKER.EVENT "BLOCKER EVENT",BLOCKER.SID "BLOCKING SID",
B_SQL.SQL_TEXT "SQL FROM BLOCKING SESSION"  FROM V$SESSION WAITER, V$SESSION BLOCKER,V$SQL W_SQL,V$SQL B_SQL
WHERE WAITER.EVENT=''enq: TX - row lock contention'' AND WAITER.BLOCKING_SESSION=BLOCKER.SID
AND W_SQL.SQL_ID=WAITER.SQL_ID
AND B_SQL.SQL_ID =NVL(BLOCKER.SQL_ID,BLOCKER.PREV_SQL_ID)';

OPEN CUR_LOCK02 FOR V_SQL02;
LOOP  
FETCH CUR_LOCK02 INTO RECORDS_LOCK02;
EXIT WHEN CUR_LOCK02%NOTFOUND;

IF RECORDS_LOCK02.WAITING_SID IS NOT NULL THEN
DBMS_OUTPUT.put_line('waiting sid: '||RECORDS_LOCK02.WAITING_SID||' wait_sql is : '||RECORDS_LOCK02.WAITING_SQL);
END IF;

IF RECORDS_LOCK02.BLOCKING_SID IS NOT NULL THEN
DBMS_OUTPUT.put_line('blocking sid: '||RECORDS_LOCK02.BLOCKING_SID||' block_sql is : '||RECORDS_LOCK02.BLOCKING_SQL);
END IF;
END LOOP;
CLOSE CUR_LOCK02;

DBMS_OUTPUT.PUT_LINE('------------------解决 锁阻塞、锁等待------------------');

SELECT   SID,SERIAL# INTO KILL_SID,KILL_SERIAL FROM V$SESSION WHERE SID=V_BLOCKING_SID ;
   
DBMS_OUTPUT.put_line('ACTION: ALTER SYSTEM KILL SESSION ( '||KILL_SID||','||KILL_SERIAL||')');

EXCEPTION WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM);

END SOLVE_LOCK;

抓取锁的sql语句-第六次修改的更多相关文章

  1. 抓取锁的sql语句-第七次修改

    最近闲来没事,把之前写的那个抓取锁的存储过程重新修改.优化了一下,呵呵 create or replace procedure solve_lock_061203_wanjie(v_msg out v ...

  2. 抓取锁的sql语句-第五次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句V_SQL02 VARCHA ...

  3. 抓取锁的sql语句-第四次修改

    --完成情况   变量V_BLOCKING_SID 用来动态抓取 产生锁的会话id,输出参数没有任何问题,但是执行报错  标识符无效! CREATE OR REPLACE PROCEDURE SOLV ...

  4. 抓取锁的sql语句-第三次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句CUR_LOCK SYS_R ...

  5. 抓取锁的sql语句-第二次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000);  --定义 v_sql 接受抓取锁的sql语句 CUR_LOCK SYS ...

  6. 抓取锁的sql语句-第一次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); CUR_LOCK SYS_REFCURSOR; TYPE TP_LOCK ...

  7. tcpdump来抓取执行的sql语句

    # tcpdump -n -nn -tttt -i eth1 -s 65535 'port 3306' -w tcpdump_mysql.ret -C 100 一个TCP包中包含多个mysql协议包, ...

  8. Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句(原创)

    Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句 查找活动的事务以及活动事务关联的会话信息 select s.sid 会话ID, s.serial# 会话序列号, s.usernam ...

  9. 数据库-SQL语句:删除和修改语句-列类型-列约束

    使用MySQL客户端连接服务器的两种方式: (1)交互模式: ——查 mysql.exe  -h127.0.0.1  -uroot  -p mysql   -uroot (2)脚本模式:——增删改 m ...

随机推荐

  1. Android Studio使用远程依赖时下载不了jar包的解决方法

    使用AS很大的一个好处就是可以使用在线jar包,只需在引用jar包的时候在版本后加上+,比如: compile 'com.facebook.fresco:fresco:0.1.0+' 这样不用在jar ...

  2. 几个Uboot命令

    1 nand scrub 这个命令会擦除坏块信息,将坏块标识成好的,但此时这个坏块有潜在有危险,在特定条件下仍会造成数据的丢失,所以应该谨慎使用. Run U-boot and then use th ...

  3. 【HDOJ】2364 Escape

    bfs.题目做的不细心,好多小错误.尤其注意起始点就是边界的情况.wa了八次. #include <iostream> #include <cstdio> #include & ...

  4. CodeAssistant

    软件名:CodeAssistant 很霸气的名字,不过目前仅有的功能是代码格式化. 用途: 在向大神请教时,不妨用这小软件把自己的代码格一下.我们的口号就是让大神看得舒心,让BUG无处遁形. 演示: ...

  5. PHP删除数组中特定元素

    方法一: <?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false) array_sp ...

  6. SQL时间格式化

    1 取值后格式化 {:d}小型:如2005 {:D}大型:如2005年5月6日 {:f}完整型 2 当前时间获取 DateTime.Now.ToShortDateString 3 取值中格式化SQL ...

  7. C#导出数据的EXCEL模板设计

    一:将如下图中,查询出来的数据导出到EXCEL中 二:Excel的状态 三:设计的背后工作 四:最后一步,隐藏

  8. Sort List ——LeetCode

    Sort a linked list in O(n log n) time using constant space complexity. 链表排序,要求时间复杂度O(nlgn),我写的归并排序. ...

  9. Maximum Subarray——LeetCode

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  10. SRM 395(1-250pt)

    DIV1 250pt 题意:在平面直角坐标系中,只能走到整点,每次有两种移动方法,可以沿平行于坐标轴方向走,也可以沿45度方向走,前者走一步耗时wt,后者走一步耗时st.比如从(x, y)可以走到(x ...