Oracle如何监测一个PLSQL过程的运行情况(三)更专业的DBMS_PIPE实现方式

昨天一个朋友问我如何监测一个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一直处于监测状态,不过这就需要修改过程使得过程中提交事务。

更多精彩内容:http://www.bianceng.cn/database/Oracle/

当前例子为了简单,设置了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包需要额外的授权

时间: 2024-08-20 19:08:37

Oracle如何监测一个PLSQL过程的运行情况(三)更专业的DBMS_PIPE实现方式的相关文章

Oracle如何监测一个PLSQL过程的运行情况(二)专业的解决方案

昨天一个朋友问我如何监测一个PL/SQL的运行状况,这里简单介绍几种方法. 介绍专业一点的DBMS_APPLICATION_INFO包. 上一篇介绍了通过INSERT和自治事务的解决方案,方法很简单,但是需要辅助的表和过程,而且这种方法显得有点不够专业. 那么这里介绍一篇相对PROFESSIONAL的解决方案,Oracle提供的DBMS_APPLICATION_INFO包: SQL> SELECT SID, ACTION 2  FROM V$SESSION 3  WHERE SID IN 4  

Oracle如何监测一个PLSQL过程的运行情况(一)最简单的INSERT的方法

今天一个朋友问我如何监测一个PL/SQL的运行状况,这里简单介绍几种方法. 介绍最简单的INSERT的方法. 他们的问题是执行下面的PL/SQL代码: SQL> SET SERVEROUT ON SQL> BEGIN 2  DBMS_OUTPUT.PUT_LINE('A'); 3  DBMS_LOCK.SLEEP(10); 4  DBMS_OUTPUT.PUT_LINE('B'); 5  DBMS_LOCK.SLEEP(10); 6  DBMS_OUTPUT.PUT_LINE('C'); 7

Oracle 数据库实例启动关闭过程

--================================ -->Oracle 数据库实例启动关闭过程 --================================ /*     Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载.Oracle数据启动的过程被划分为 几个不同的步骤,在不同的启动过程中,我们可以对其实现不同的操作,系统修复等等工作,因此了解Oracle数据启动.关闭是非常 有必要的.下面详细了Oracle Database

多个Oracle数据库创建一个Excel报表

微软的 Excel 电子表格广泛应用于当今的商业环境中.尽管 Excel 能够读取和显示分隔文件,但 .xls 专有格式提供了其他一些富于表现力的特性,其中包括字体格式和多工作表电子表格. 许多商业和开放源代码的工具都提供了生成可由 Excel 读取的报表的功能. 比如,您可以使用 Oracle Reports 生成一个电子表格,或使用 SQL*Plus 输出一个由逗号分隔的文件. 利用现有的一些工具可以访问多个数据源. 但报表的格式与特定查询的结果紧密联系,而不同的数据源有时会生成不同的结果.

oracle怎么导出一个表结构到excel,包括字段,注释,长度等

问题描述 oracle怎么导出一个表结构到excel,包括字段,注释,长度等 写一个数据库文档,以方便日后 好查看数据库结构维护 解决方案 使用PL/SQL登录,右键点击需要导出表结构的表,选择查看,在对话框选择列,按图来做就OK了 解决方案二: oracle 怎么读取表结构和注释,生成数据库结构文档 解决方案三: 用Navicat啊 批量导出,导出格式可以选 解决方案四: plsql中有一个跟跟柱状图一样的按钮,里面有一个选项,可以直接导出来 解决方案五: plsql中有一个跟跟柱状图一样的按

O2O这个概念是个伪命题线上线下链接是一个必然过程

@阿里COO张勇:O2O这个概念是个伪命题. O2O这个概念是个伪命题线上线下链接是一个必然过程,但是商业模式并不一样.任何一个行业都存在用互联网思维升级商业形态的可能性,但这个变化很难用一个统一或者单一的O2O命题去解决,讨论这个话题必须要看行业场景及痛点,如如何利用信息技术升级,如何利用大数据等等. @宝岛眼镜老大反思:为什么我认为online2offline(O2O)是伪命题. 因为线上与线下不应该是冲突的,不应该是谁导流给谁.我认为未来的企业必须是O+O,线上加线下,技术环节的O+差异化

java-求一个导入项目即可运行的svnkit项目,实现checkout update

问题描述 求一个导入项目即可运行的svnkit项目,实现checkout update 搞了几天就是运行不了,实在是崩溃了,求大神给一个能用的,网上的也下载了,就是不行! 解决方案 自己搭一个简单的服务器,随你玩,很容易搭的

c++-一个小白对于C++运行时窗口闪退的疑惑

问题描述 一个小白对于C++运行时窗口闪退的疑惑 当我在用VS2013学着实例编一些小程序时总是需要不停的用到system(""pause""),但又有人说不要频繁的使用该语句,因为不合适之类的,但是除了该语句还有别的阻止窗口闪退的办法么? 解决方案 直接在最后加while(1){};就行了,这样不管程序在哪个上面都不会退 解决方案二: 闪退是你点击exe运行发生的吗?用Getchar(): 解决方案三: ctrl+F5 (直接运行不调试) 解决方案四: 你一定是按

javaswing-JavaSwing 怎么做一个实时监控软件运行流程的界面。

问题描述 JavaSwing 怎么做一个实时监控软件运行流程的界面. 如 有这样一个流程: 开始-数据下载- 数据管理-数据预报-产品生成-产品显示-产品发布当程序运行在数据下载的时候,我用什么显示他正在执行 数据下载.求大神讲解!