Oracle技术之如何监测一个PLSQL过程的运行情况(三)
2013-06-07 10:05
316 查看
昨天一个朋友问我如何监测一个PL/SQL的运行状况,这里简单介绍几种方法。
介绍更专业的DBMS_PIPE实现方式。
如果觉得DBMS_APPLICATION_INFO包还不够专业,这里再介绍一篇更加PROFESSIONAL的解决方案,通过DBMS_PIPE实现进程间通信。
利用这种方法,进行操作的PL/SQL过程可以通过管道发送消息给接收进程。下面给出一个最简单的例子:
SQL> CREATE TABLE T_RECORD
2 (STR VARCHAR2(30),
3 TIME DATE);
表已创建。
建立一个记录表。
随后,负责监测的进程启动一个PIPE,然后定时检测PIPE中是否存在数据:
SQL> DECLARE
2 V_RETURN NUMBER;
3 V_STR VARCHAR2(32767);
4 BEGIN
5 V_RETURN := DBMS_PIPE.CREATE_PIPE('P_TEST');
6 WHILE (V_RETURN = 0) LOOP
7 V_RETURN := DBMS_PIPE.RECEIVE_MESSAGE('P_TEST', 360);
8 IF V_RETURN = 0 THEN
9 DBMS_PIPE.UNPACK_MESSAGE(V_STR);
10 INSERT INTO T_RECORD VALUES (V_STR, SYSDATE);
11 END IF;
12 END LOOP;
13 V_RETURN := DBMS_PIPE.REMOVE_PIPE('P_TEST');
14 END;
15 /
需要注意,正常情况下,很可能这个PL/SQL一直处于监测状态,不过这就需要修改过程使得过程中提交事务。
当前例子为了简单,设置了10分钟的过期时间,确保要监控的PL/SQL发消息的时间间隔小于10分钟。在这10分钟内,在另外的会话运行PL/SQL代码:
SQL> DECLARE
2 V_STR VARCHAR2(4000) := 'STEP BEGIN';
3 V_RETURN NUMBER;
4 BEGIN
5 DBMS_PIPE.PACK_MESSAGE(V_STR);
6 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
7 DBMS_LOCK.SLEEP(60);
8 V_STR := 'STEP MIDDLE';
9 DBMS_PIPE.PACK_MESSAGE(V_STR);
10 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
11 DBMS_LOCK.SLEEP(60);
12 V_STR := 'STEP END';
13 DBMS_PIPE.PACK_MESSAGE(V_STR);
14 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
15 END;
16 /
PL/SQL过程已成功完成。
当这个代码运行结束10分钟后,前面监测过程由于超时退出运行,这时检查日志信息:
PL/SQL过程已成功完成。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
会话已更改。
SQL> SELECT * FROM T_RECORD;
STR TIME
------------------------------ -------------------
STEP BEGIN 2010-04-28 16:33:43
STEP MIDDLE 2010-04-28 16:34:43
STEP END 2010-04-28 16:35:43
这种方法适用于专门的监测程序。不过DBMS_PIPE包需要额外的授权
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
介绍更专业的DBMS_PIPE实现方式。
如果觉得DBMS_APPLICATION_INFO包还不够专业,这里再介绍一篇更加PROFESSIONAL的解决方案,通过DBMS_PIPE实现进程间通信。
利用这种方法,进行操作的PL/SQL过程可以通过管道发送消息给接收进程。下面给出一个最简单的例子:
SQL> CREATE TABLE T_RECORD
2 (STR VARCHAR2(30),
3 TIME DATE);
表已创建。
建立一个记录表。
随后,负责监测的进程启动一个PIPE,然后定时检测PIPE中是否存在数据:
SQL> DECLARE
2 V_RETURN NUMBER;
3 V_STR VARCHAR2(32767);
4 BEGIN
5 V_RETURN := DBMS_PIPE.CREATE_PIPE('P_TEST');
6 WHILE (V_RETURN = 0) LOOP
7 V_RETURN := DBMS_PIPE.RECEIVE_MESSAGE('P_TEST', 360);
8 IF V_RETURN = 0 THEN
9 DBMS_PIPE.UNPACK_MESSAGE(V_STR);
10 INSERT INTO T_RECORD VALUES (V_STR, SYSDATE);
11 END IF;
12 END LOOP;
13 V_RETURN := DBMS_PIPE.REMOVE_PIPE('P_TEST');
14 END;
15 /
需要注意,正常情况下,很可能这个PL/SQL一直处于监测状态,不过这就需要修改过程使得过程中提交事务。
当前例子为了简单,设置了10分钟的过期时间,确保要监控的PL/SQL发消息的时间间隔小于10分钟。在这10分钟内,在另外的会话运行PL/SQL代码:
SQL> DECLARE
2 V_STR VARCHAR2(4000) := 'STEP BEGIN';
3 V_RETURN NUMBER;
4 BEGIN
5 DBMS_PIPE.PACK_MESSAGE(V_STR);
6 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
7 DBMS_LOCK.SLEEP(60);
8 V_STR := 'STEP MIDDLE';
9 DBMS_PIPE.PACK_MESSAGE(V_STR);
10 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
11 DBMS_LOCK.SLEEP(60);
12 V_STR := 'STEP END';
13 DBMS_PIPE.PACK_MESSAGE(V_STR);
14 V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
15 END;
16 /
PL/SQL过程已成功完成。
当这个代码运行结束10分钟后,前面监测过程由于超时退出运行,这时检查日志信息:
PL/SQL过程已成功完成。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
会话已更改。
SQL> SELECT * FROM T_RECORD;
STR TIME
------------------------------ -------------------
STEP BEGIN 2010-04-28 16:33:43
STEP MIDDLE 2010-04-28 16:34:43
STEP END 2010-04-28 16:35:43
这种方法适用于专门的监测程序。不过DBMS_PIPE包需要额外的授权
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
相关文章推荐
- Oracle技术之如何监测一个PLSQL过程的运行情况(一)
- Oracle技术之如何监测一个PLSQL过程的运行情况(二)
- 如何监测一个PLSQL过程的运行情况(二)
- 如何监测一个PLSQL过程的运行情况(三)
- oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)
- 如何在不装ORACLE的情况下使用PLSQL
- oracle技术之如何在存储过程中做简单动态查询(二)
- oracle如何在一个存储过程中调用另一个返回游标的存储过程
- 【虚拟机】oracle Virtual Box4.2.6虚拟机正在运行的过程中删除了其上的一个备份,之后虚拟机就无法使用了
- 如何在安装32位Oracle客户端组件的情况下以64位模式运行
- 从技术角度看Oracle计划请求运行过程
- 如何查看ORACLE中正在运行的存储过程
- 如何在安装32位Oracle客户端组件的情况下以64位模式运行
- 如何在ORACLE启动时执行一个自定义的存储过程
- [技术讨论]一个需求讨论的对话过程——看如何挖掘实际需求
- ORACLE如何停止一个正在运行的JOB
- 自己写的一个身份证号码判断的过程包,运行环境为plsql
- 如何在不装ORACLE的情况下使用PLSQL
- 如何在unity游戏运行过程中给GameObject添加一个组件
- 如何在安装32位Oracle客户端组件的情况下以64位模式运行