Oracle DBMS_APPLICATION_INFO 用法例子(ZT)

jolly10發表於2008-01-17

Application developers can use the DBMS_APPLICATION_INFO package with Oracle Trace and the SQL trace facility to record names of executing modules or transactions in the database for later use when tracking the performance of various modules and debugging.

When an application registers with the database, its name and actions are recorded in the V$SESSION and V$SQLAREA views.

[@more@]
Oracle DBMS_APPLICATION_INFO 用法例子

from:

General Information
Source{ORACLE_HOME}/rdbms/admin/dbmsapin.sql
First Available7.3.4
Constants
NameData TypeValue
set_session_longops_nohintBINARY_INTEGER-1
Dependencies
DBMS_BACKUP_RESTOREEM_PINGKUPV$FT
DBMS_STATSEM_SEVERITY_REPOSKUPW$WORKER
EMD_CRONOS_ADMINgv_$sessionWWV_FLOW
EMD_LOADERgv_$session_longopWWV_FLOW_SC_TRANSACTIONS
EMD_MAINTENANCEgv_$sqlareaWWV_FLOW_SW_SCRIPT
EMD_NOTIFICATIONKUPM$MCP
READ_CLIENT_INFO

Read the value of the client_info field of the current session
dbms_application_info.set_client_info(
client_info OUT VARCHAR2(64));
exec dbms_application_info.set_client_info('B%');

set serveroutput on

DECLARE
x VARCHAR2(100);
BEGIN
dbms_application_info.read_client_info(x);
dbms_output.put_line(x);
END;
/

exec dbms_application_info.set_client_info('747');

DECLARE
x VARCHAR2(100);
BEGIN
dbms_application_info.read_client_info(x);
dbms_output.put_line(x);
END;
/

-- the following will not work but try it so that you understand why
-- you can not use a stored procedure in a WHERE clause
CREATE OR REPLACE VIEW airplanes_view AS
SELECT *
FROM airplanes
WHERE program_id = dbms_application_info.read_client_info(x);

-- wrap the stored procedure so that it presents itself as a functionCREATE OR REPLACE FUNCTION app_info_wrapper RETURN VARCHAR2 IS
x VARCHAR2(64);
BEGIN
dbms_application_info.read_client_info(x);
RETURN x;
END app_info_wrapper;
/

-- now you can create the view
CREATE OR REPLACE VIEW airplanes_view AS
SELECT *
FROM airplanes
WHERE program_id = app_info_wrapper;

SELECT * FROM airplanes_view;

exec dbms_application_info.set_client_info('777');

SELECT * FROM airplanes_view;
READ_MODULE

Reads the values of the module and action fields of the current session
dbms_application_info.read_module(
module_name OUT VARCHAR2(48),
action_name OUT VARCHAR2(32));
set serveroutput on

DECLARE
mod_in VARCHAR2(48);
act_in VARCHAR2(32);

mod_out VARCHAR2(48);
act_out VARCHAR2(32);

display_str VARCHAR2(200);
BEGIN
mod_in := 'Test Module';
act_in := 'Test Action';
dbms_application_info.set_module(mod_in, act_in);

dbms_lock.sleep(5);

dbms_application_info.read_module(mod_out, act_out);

display_str := 'Module Is '||mod_out||' and Action is '||act_out;

dbms_output.put_line(display_str);
END;
/
SET_ACTION
Sets the name of the current action within the current moduledbms_application_info.set_action(action_name IN VARCHAR2(32));
exec dbms_application_info.set_action('Load Departments');
SET_CLIENT_INFO

Set Client Info Field For The Session
dbms_application_info.set_client_info(client_info IN VARCHAR2(64));
CREATE OR REPLACE VIEW btest AS
SELECT object_name
FROM all_objs
WHERE object_name LIKE userenv('client_info');

SELECT * FROM btest;

exec dbms_application_info.set_client_info('B%');

SELECT * FROM btest;

--====================================

CREATE OR REPLACE VIEW vair AS
SELECT *
FROM airplanes
WHERE program_id = userenv('client_info');

SELECT * FROM vair;

exec dbms_application_info.set_client_info('747');

SELECT * FROM vair;
SET_MODULE
Sets the name of the module that is currently runningdbms_application_info.set_module(
module_name IN VARCHAR2(48),
action_name IN VARCHAR2(32));
exec dbms_application_info.set_module('LOAD_TAB', 'Load Emp');

Sets a row in the GV$SESSION_LONGOPS view
dbms_application_info.set_session_longops(
rindex IN OUT BINARY_INTEGER,
slno IN OUT BINARY_INTEGER,
op_name IN VARCHAR2(64) DEFAULT NULL,
target IN BINARY_INTEGER DEFAULT 0,
context IN BINARY_INTEGER DEFAULT 0,
sofar IN NUMBER DEFAULT 0,
totalwork IN NUMBER DEFAULT 0,
target_desc IN VARCHAR2(32) DEFAULT 'unknown_target',
units IN VARCHAR2(32) DEFAULT NULL);

rindex constant to start a new row
set_session_longops_nohint constant BINARY_INTEGER := -1;
use returned value from previous call to reuse a row

do not use slno ... for internal use by Oracle

target is the object number being worked on

sofar is any number indicating proress ... so far

totalwork a best guess as to the 100% value ... on completion

units used for sofar and totalwork
CREATE TABLE test (
testcol NUMBER(10));

-- Session 1
SELECT DISTINCT sid FROM gv$mystat;
-- use this sid number in the session 2 query below

DECLARE
rindex BINARY_INTEGER;
slno BINARY_INTEGER;
sofar NUMBER(6,2);
target BINARY_INTEGER;
totwork NUMBER := 100;
BEGIN
rindex := dbms_application_info.set_session_longops_nohint;

SELECT object_id
INTO target
FROM all_objs
WHERE object_name = 'TEST';

FOR i IN 1 .. totwork
LOOP
sofar := i;
dbms_application_info.set_session_longops(rindex, slno,
'PSOUG', target, 0, sofar, 100, 'Pct Complete');

INSERT INTO test VALUES (i);

dbms_lock.sleep(0.25);
END LOOP;
COMMIT;
END;
/

-- Session 2 substitute the sid returned above from session 1SELECT sid, serial#, schemaname
FROM gv$session;
SELECT start_time, sofar, totalwork, time_remaining, elapsed_seconds
FROM gv$session_longops
WHERE sid = 140
AND serial# = 266;
DBMS_APPLICATION_INFO Demo

Set Action Demo
CREATE TABLE test (
testcol NUMBER(10));

-- session 1
DECLARE
mod_name VARCHAR2(48);
act_name VARCHAR2(32);
BEGIN
mod_name := 'read mod';
act_name := 'inserting';
dbms_application_info.set_module(mod_name, act_name);

FOR x IN 1..5
LOOP
FOR i IN 1 ..60
LOOP
INSERT INTO test VALUES (i);
COMMIT;
dbms_lock.sleep(1);
END LOOP;

act_name := 'deleting';
dbms_application_info.set_action(act_name);
FOR i IN 1 ..60
LOOP
DELETE FROM test WHERE testcol = i;
COMMIT;
dbms_lock.sleep(1);
END LOOP;
END LOOP;
END;
/

-- session 2
col module format a20
col action format a20

SELECT module, action
FROM gv$session;

SELECT module, action
FROM gv$sqlarea;

SELECT sql_text, disk_reads, module, action
FROM gv$sqlarea
WHERE action = 'deleting';

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-997571/,如需轉載,請註明出處,否則將追究法律責任。

相關文章