`

DBMS_APPLICATION_INFO包的使用

阅读更多

DBMS_APPLICATION_INFO是一个非常有用的程序包,他提供了通过V$SESSION
跟踪脚本运行情况的能力,该包允许你在v$session中的如下三列中填值:
CLIENT_INFO,MODULE,ACTION,该包不仅提供了设置这些列值的过程,还提供了
返回这些列值的过程,在CLIENT_INFO列中适合存放允许你的程序的客户端信息,
MODULE列适合存放你的主程序名,如包的名称,ACTION列适合存放你的程序包中
的过程名,现在我们先简单了解一下DBMS_APPLICATION_INFO的和V$session相关
的函数:

  dbms_application_info.set_client_info:允许你向v$session中写入你的客户端的信息
  dbms_application_info.set_module:允许你向v$session中写入你的主程序(如包)
  和你的过程的名称
  dbms_application_info.read_client_info:允许你从v$session中读取客户端的信息
  dbms_application_info.read_module:允许你从v$session中读取主程序(如包)
  和你的过程的名称
 
看一个简单的例子:


SQL> set serveroutput on
SQL> 
SQL> DECLARE
  2 l_clinent VARCHAR2(100);
  3 l_mod_name VARCHAR2(100);
  4 l_act_name VARCHAR2(100);
  5 BEGIN
  6 dbms_application_info.set_client_info('my client');
  7 dbms_application_info.read_client_info(l_clinent);
  8 dbms_output.put_line('client='||l_clinent);
  9 dbms_application_info.set_module('my mod','inserting');
 10 FOR i IN 1..100
 11 LOOP
 12 execute immediate 'INSERT INTO pp_test(c1) VALUES(:X)' USING i;
 13 END LOOP;
 14 dbms_application_info.read_module(l_mod_name,l_act_name);
 15 dbms_output.put_line('mod_name='||l_mod_name);
 16 dbms_output.put_line('act_name='||l_act_name);
 17 END;
 18  
 19 /
 
client=my client
mod_name=my mod
act_name=inserting
 
PL/SQL procedure successfully completed
 
SQL> commit;
 
Commit complete
 
SQL> select sid from v$mystat where rownum=1;
 
  SID
----------
  1065
 
SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=1065;
 
  SID SERIAL# CLIENT_INFO MODULE ACTION
---------- ---------- ---------------------------------------------------------------- ------------------------------------------------ --------------------------------
  1065 18968 my client my mod inserting
 
再看一个更有用的例子:

 1.首先我们构建一个有大量数据的表:

SQL> DELETE FROM pp_test;
 
1320 rows deleted
 
SQL> insert into pp_test(c1) select object_name from all_objects;
 
116441 rows inserted
 
SQL> insert into pp_test(c1) select c1 from pp_test;
 
116441 rows inserted
 
SQL> insert into pp_test(c1) select c1 from pp_test;
 
232882 rows inserted
 
SQL> insert into pp_test(c1) select c1 from pp_test;
 
465764 rows inserted
 
SQL> commit;
 
Commit complete

 2.我们现在需要更新PP_TEST表的C1列,在脚本执行过程中我们需要知道
  已经处理的行数和已经花费的时间,执行结束后,我们需要知道处理的
  总的行数和执行的总时间,使用如下代码:
   
  --在session1中执行:
DECLARE
CURSOR cur_test IS
SELECT c1,ROWID
FROM pp_test;
l_new_c1 VARCHAR2(2000);
l_count_num PLS_INTEGER := 0;
l_start_time_num PLS_INTEGER;
BEGIN
l_start_time_num := DBMS_UTILITY.GET_TIME;
FOR cur_test_rec IN cur_test LOOP
l_count_num := l_count_num + 1;
l_new_c1 := cur_test_rec.c1||'_NEW';
UPDATE pp_test
SET c1 = l_new_c1
WHERE rowid = cur_test_rec.ROWID;
IF MOD(l_count_num, 1000) = 0 THEN
DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ' ||
l_count_num, 'Elapsed: ' || (DBMS_UTILITY.GET_TIME -
l_start_time_num)/100 || ' sec'); --每更新1000行,记录一次执行时间
END IF;
END LOOP;
COMMIT;
DBMS_APPLICATION_INFO.SET_MODULE('Records Processed: ' ||
l_count_num, 'Elapsed: ' || (DBMS_UTILITY.GET_TIME -
l_start_time_num)/100 || ' sec'); --更新结束,记录总的执行时间
END;

执行过程中我们可以查询v$session,如下所示:

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;
 
  SID SERIAL# CLIENT_INFO MODULE ACTION
---------- ---------- ---------------------------------------------------------------- ------------------------------------------------ --------------------------------
  307 36536 Records Processed: 360000 Elapsed: 18.69 sec
 
SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;
 
  SID SERIAL# CLIENT_INFO MODULE ACTION
---------- ---------- ---------------------------------------------------------------- ------------------------------------------------ --------------------------------
  307 36536 Records Processed: 626000 Elapsed: 32.99 sec
 
SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;
 
  SID SERIAL# CLIENT_INFO MODULE ACTION
---------- ---------- ---------------------------------------------------------------- ------------------------------------------------ --------------------------------
  307 36536 Records Processed: 837000 Elapsed: 44.56 sec
   
执行结束,我们再次查询v$session:

SQL> SELECT sid,serial#,client_info,MODULE,action FROM v$session WHERE sid=307;
 
  SID SERIAL# CLIENT_INFO MODULE ACTION
---------- ---------- ---------------------------------------------------------------- ------------------------------------------------ --------------------------------
  307 36536 Records Processed: 931528 Elapsed: 49.86 sec
 
SQL> 

分享到:
评论

相关推荐

    Oracle PL/SQL常用47个工具包

    15. **DBMS_APPLICATION_INFO**: 用于设置和查询应用程序上下文信息,帮助追踪和监控用户会话。 16. **DBMS_REDEFINITION**: 在线重定义表,允许在不中断应用的情况下更改表结构。 17. **DBMS_CRYPTO**: 提供加密...

    Oracle内置包的使用方法.rar

    `DBMS_APPLICATION_INFO.SET_CLIENT_INFO`设置客户端信息,`DBMS_APPLICATION_INFO.READ_CLIENT_INFO`读取信息。 14. **DBMS_SPACE**: 监控和管理数据库空间,如计算表空间和段的使用情况。`DBMS_SPACE.SPACE_USAGE...

    DBMS_Sample

    《DBMS_Sample:数据库管理系统实例与API应用详解》 在信息技术领域,数据库管理...通过学习这些内容,开发者不仅可以深化对DBMS的理解,还能熟练掌握在移动设备上使用DBMS API进行数据操作的技巧,从而提升开发能力。

    oracle 报表开发中用PCK直接生成xml数据文件

    本文将详细讨论如何使用Package(PCK)直接生成XML数据文件,特别关注使用`dbms_xmlgen.getXML()`过程的方法。 Oracle的`dbms_xmlgen`包提供了生成XML文档的功能,它能够将数据库查询结果转换成XML格式。在描述中...

    通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求

    可以使用数据库的日志功能记录输出结果,或者直接通过`DBMS_OUTPUT`查看响应。 #### 结论 通过以上介绍,我们可以看到`UTL_HTTP`工具包为Oracle环境下的HTTP交互提供了丰富的功能和支持。无论是简单的GET请求还是...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    DBMS_APPLICATION_INFO 包为用户提供了一个强大的机制来交换环境中执行处理的时间点信息。通过这种方式,可以在长时间运行的 PL/SQL 程序中实时地监控进度,例如每处理一定数量的数据就更新一次进度信息。 **示例**...

    Oracle运维最佳实践-下.pdf 带书签

    - 使用`DBMS_WORKLOAD_REPOSITORY`包来查询AWR数据,如`DBMS_WORKLOAD_REPOSITORY.REPORT_SQL_MONITOR`函数可以生成特定SQL语句的性能报告。 - **2.1.2 SPA(SQL Performance Analyzer)** - SPA是一个强大的工具...

    在Oracle运行操作系统命令

    因此,在Oracle 8i及更高版本中,可以通过使用`DBMS_PIPE`包来实现在存储过程中执行OS命令的功能。 #### DBMS_PIPE 包简介 `DBMS_PIPE`包提供了在Oracle进程中创建和管理管道的能力,允许两个或多个Oracle进程之间...

    Oracle PL SQL BuiltIns - Pocket Reference

    - **DBMS_APPLICATION_INFO**:这个包允许开发者设置和查询应用级别的信息,如应用名称、模块名称和动作名称,这对于跟踪和监控系统性能非常有用。 - **DBMS_AQ**(Advanced Queuing):提供消息队列服务,支持...

    【RAC】rac中如何指定job的运行实例.pdf

    2. DBMS_JOB和DBMS_SCHEDULER包的特点和使用场景。 3. 在RAC环境中如何指定job运行的实例级别。 4. 如何获取RAC集群中所有节点的IP地址。 5. Oracle系统视图的使用以及获取存储设备相关信息的命令。 6. 如何优化和...

    如何在Oracle数据库10g中跟踪SQL

    开发人员可以通过PL/SQL包DBMS_APPLICATION_INFO设置这些信息。服务名称则由连接字符串确定,未指定服务的会话将关联到sys$users服务。 启用跟踪的过程可以分为几个步骤。首先,可以设定user_dump_dest参数来指定...

    DBMS_LOGMNR中的常量选项

    DBMS_LOGMNR是Oracle数据库提供的一个包,用于分析重做日志文件(redo logs),以获取数据库的事务历史信息。这个包中的常量选项是DBMS_LOGMNR的参数,用于定制LogMiner的行为。以下是一些重要的常量选项及其详细...

    oracle pl/sql 开发api

    在Oracle中,PL/SQL API通常表现为一组预定义的包,例如DBMS_OUTPUT用于调试,DBMS_ALERT用于异步通知,DBMS_LOCK用于锁定机制,DBMS_JOB用于计划任务等。这些包提供了丰富的功能,允许开发者执行各种数据库操作,而...

    oracle通过存储过程POST方式访问接口

    1. 创建ACL(访问控制列表):使用`DBMS_ACL`包创建一个ACL,指定允许的网络地址和协议。 2. 将用户与ACL关联:使用`DBMS_ACL_ADMIN`包将特定的数据库用户添加到ACL中,赋予他们网络访问权限。 3. 应用ACL到网络资源...

    IT文档\dbms\Oracle

    《IT文档\dbms\Oracle》系列,主要记录了一位DBA在工作中遇到的问题与解决方案,以日记的形式展现了Oracle数据库管理的日常。Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统,其复杂性和灵活性使得DBA的...

    oracle scheuler

    应用程序可以使用 `DBMS_SCHEDULER.SIGNAL` 过程抛出事件,这些事件可以被 Job 监听。 #### 六、使用 Chains Chain 是一系列有序的任务集,可以定义任务间的依赖关系。创建 Chain 时,可以指定任务的执行顺序。 *...

    plsql_session.docx

    - **CLIENT_INFO**: 由`DBMS_APPLICATION_INFO`包设置的客户信息。 - **ACTION**: 由`DBMS_APPLICATION_INFO`包设置的动作信息。 - **MODULE**: 由`DBMS_APPLICATION_INFO`包设置的应用模块信息。 7. **其他重要...

    PLSQL最佳实践

    - 示例:`PROCEDURE get_employee_details(p_employee_id IN NUMBER, p_employee_info OUT EMPLOYEE_INFO);` **2.2.3 变量是表的字段** - 当变量表示表中的单个字段时,应使用相应的数据类型。 - 示例:`DECLARE v_...

Global site tag (gtag.js) - Google Analytics