暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB T 的数据库创建脚本之:initwsr.sql 高斯的 AWR

原创 eygle 2019-12-09
1532

在 GaussDB T 中,完成数据库创建的最后一个脚本是 initwsr.sql ,这是高斯数据库的 『AWR』。

DROP TABLE IF EXISTS WSR_EXCEPTION_LOG
/

CREATE TABLE WSR_EXCEPTION_LOG
(
CTIME DATE NOT NULL,
PROCEDURENAME VARCHAR(100) NOT NULL,
ERRORINFO VARCHAR(8000) NOT NULL
)
TABLESPACE SYSTEM
/

CREATE INDEX IX_EXCEPTION_LOG ON WSR_EXCEPTION_LOG(CTIME)
TABLESPACE SYSTEM
/

CREATE OR REPLACE PROCEDURE WSR$INSERT_ERRORLOG
(
STR_IN_PNAME IN VARCHAR,
STR_IN_ERRORINFO IN VARCHAR
)
AS
BEGIN
INSERT INTO WSR_EXCEPTION_LOG
( CTIME,
PROCEDURENAME,
ERRORINFO
)
VALUES( SYSDATE,
STR_IN_PNAME,
STR_IN_ERRORINFO
);
COMMIT;
END;
/

DECLARE
I_L_COUNT INT;
I_L_NUM INT := 0;
BEGIN
FOR ITEM IN (SELECT * FROM MY_JOBS WHERE WHAT IN (‘WSRCREATESNAPSHOT();,WSRCREATE_SNAPSHOT();', 'WSRDROP_SNAPSHOT_TIME();’, ‘WSR$CREATE_SESSION_SNAPSHOT();’)) LOOP
DBMS_JOB.BROKEN(ITEM.JOB, TRUE);
END LOOP;
COMMIT;

LOOP
    SELECT COUNT(*)
      INTO I_L_COUNT
      FROM MY_JOBS A, ADM_JOBS_RUNNING B
     WHERE WHAT IN ('WSR$CREATE_SNAPSHOT();', 'WSR$DROP_SNAPSHOT_TIME();', 'WSR$CREATE_SESSION_SNAPSHOT();')
       AND A.JOB = B.JOB;
    
    IF (I_L_COUNT > 0) THEN
        SLEEP(1);
        I_L_NUM := I_L_NUM + 1;
        
        IF (I_L_NUM > 15) THEN
            RAISE_APPLICATION_ERROR(-20000, 'CAN''T STOP WSR JOB!');
        END IF;
    ELSE
        EXIT;
    END IF;
END LOOP;

END;
/

DROP TABLE IF EXISTS WSR_CONTROL_BK
/

DECLARE
I_L_COUNT BINARY_INTEGER;
BEGIN
SELECT COUNT(*)
INTO I_L_COUNT
FROM SYS_TABLES
WHERE NAME = ‘WSR_CONTROL’
AND USER# = 0;

IF (I_L_COUNT > 0) THEN
    EXECUTE IMMEDIATE 'CREATE TABLE WSR_CONTROL_BK AS SELECT * FROM WSR_CONTROL';
END IF;

END;
/

DROP TABLE IF EXISTS WRM$_WR_CONTROL
/
DROP TABLE IF EXISTS WSR_CONTROL
/

CREATE TABLE WSR_CONTROL
(
DBID BINARY_INTEGER NOT NULL,
SNAP_INTERVAL INTERVAL DAY(5) TO SECOND(1) NOT NULL,
SNAPINT_NUM BINARY_INTEGER NOT NULL,
RETENTION INTERVAL DAY(5) TO SECOND(1) NOT NULL,
RETENTION_NUM BINARY_INTEGER NOT NULL,
MOST_RECENT_SNAP_ID BINARY_INTEGER,
MOST_RECENT_SNAP_TIME TIMESTAMP(3),
STATUS VARCHAR(3) NOT NULL,
MOST_RECENT_PURGE_TIME TIMESTAMP(3),
TOPNSQL BINARY_INTEGER NOT NULL,
LOG_DAYS BINARY_INTEGER DEFAULT 30 NOT NULL,
SESSION_STATUS VARCHAR(3) NOT NULL,
SESSION_INTERVAL BINARY_INTEGER NOT NULL
)
TABLESPACE SYSTEM
/

INSERT INTO WSR_CONTROL(DBID, SNAP_INTERVAL, SNAPINT_NUM, RETENTION, RETENTION_NUM, STATUS, TOPNSQL, LOG_DAYS, SESSION_STATUS, SESSION_INTERVAL)
SELECT DBID, NUMTODSINTERVAL(30, ‘MINUTE’), 1800, NUMTODSINTERVAL(2, ‘DAY’), 2*86400, ‘Y’, 200, 30, ‘Y’, 30
FROM DV_DATABASE
/

CREATE OR REPLACE PROCEDURE WSR$CHECK_COLUMN
(
STR_IN_COLUMNNAME IN VARCHAR
)
AS
I_L_COUNT INTEGER;
BEGIN
SELECT COUNT(*)
INTO I_L_COUNT
FROM MY_TAB_COLUMNS
WHERE TABLE_NAME = ‘WSR_CONTROL_BK’
AND COLUMN_NAME = UPPER(STR_IN_COLUMNNAME);

IF (I_L_COUNT > 0) THEN
    EXECUTE IMMEDIATE 'UPDATE WSR_CONTROL SET ' || STR_IN_COLUMNNAME || ' = NVL((SELECT ' || STR_IN_COLUMNNAME || ' FROM WSR_CONTROL_BK), ' || STR_IN_COLUMNNAM

E ||’)’;
END IF;

EXCEPTION
WHEN OTHERS THEN
WSRINSERTERRORLOG(WSRINSERT_ERRORLOG('WSRCHECK_COLUMN’, SUBSTR(SQLERRM,1,2000));
END;
/

CALL WSRCHECKCOLUMN(SNAPINTERVAL)/CALLWSRCHECK_COLUMN('SNAP_INTERVAL') / CALL WSRCHECK_COLUMN(‘SNAPINT_NUM’)
/
CALL WSRCHECKCOLUMN(RETENTION)/CALLWSRCHECK_COLUMN('RETENTION') / CALL WSRCHECK_COLUMN(‘RETENTION_NUM’)
/
CALL WSRCHECKCOLUMN(STATUS)/CALLWSRCHECK_COLUMN('STATUS') / CALL WSRCHECK_COLUMN(‘TOPNSQL’)
/
CALL WSRCHECKCOLUMN(LOGDAYS)/CALLWSRCHECK_COLUMN('LOG_DAYS') / CALL WSRCHECK_COLUMN(‘SESSION_STATUS’)
/
CALL WSR$CHECK_COLUMN(‘SESSION_INTERVAL’)
/

DROP PROCEDURE WSR$CHECK_COLUMN
/
DROP TABLE IF EXISTS WSR_CONTROL_BK
/
DROP VIEW IF EXISTS DBA_HIST_WR_CONTROL
/

CREATE OR REPLACE VIEW ADM_HIST_WR_CONTROL AS
SELECT DBID, SNAP_INTERVAL, RETENTION, TOPNSQL, STATUS, LOG_DAYS, SESSION_STATUS, SESSION_INTERVAL
FROM SYS.WSR_CONTROL
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_WR_CONTROL FOR SYS.ADM_HIST_WR_CONTROL
/

–WSR_TRANSACTION
DROP TABLE IF EXISTS WSR_TRANSACTION
/

CREATE TABLE WSR_TRANSACTION
(
SNAP_TIME DATE NOT NULL,
SID BINARY_INTEGER NOT NULL,
UNDO_COUNT BINARY_INTEGER,
BEGIN_TIME DATE
)
PARTITION BY RANGE(SNAP_TIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

–WSR_LOCK
DROP TABLE IF EXISTS WSR_LOCK_OBJECT
/

CREATE TABLE WSR_LOCK_OBJECT
(
SNAP_TIME DATE NOT NULL,
SID BINARY_INTEGER,
OBJECT_NAME CHAR(68 BYTE),
LMODE CHAR(10 BYTE)
)
PARTITION BY RANGE(SNAP_TIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_LOCK_OBJECT ON WSR_LOCK_OBJECT(SNAP_TIME, SID) LOCAL
TABLESPACE SYSTEM
/

–WSR_SESSION_SUMMARY
DROP TABLE IF EXISTS WSR_INSTANCE_SNAP
/

CREATE TABLE WSR_INSTANCE_SNAP
(
SNAP_TIME DATE,
SESSION_NUM BINARY_INTEGER,
ACTIVE_SESS_NUM BINARY_INTEGER,
LOCK_NUM BINARY_INTEGER,
TRANSACTION_NUM BINARY_INTEGER,
TEMP_BUFFER_FREE BINARY_INTEGER,
DATA_BUFFER_PIN BINARY_INTEGER,
TS_SYSTEM_FREE BINARY_BIGINT,
TS_SYSWARE_FREE BINARY_BIGINT,
TS_USER_FREE BINARY_BIGINT,
TXN_PAGES BINARY_INTEGER,
UNDO_PAGES BINARY_INTEGER
)
PARTITION BY RANGE(SNAP_TIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_INSTANCE_SNAP ON WSR_INSTANCE_SNAP(SNAP_TIME) LOCAL
TABLESPACE SYSTEM
/

–WSR_SESSION_SQL
DROP TABLE IF EXISTS WSR_SESSION_SQL
/

CREATE TABLE WSR_SESSION_SQL
(
SID BINARY_INTEGER,
CTIME DATE,
SQL_ID VARCHAR(32 BYTE),
CURR_SCHEMA VARCHAR(64 BYTE),
CLIENT_IP VARCHAR(20 BYTE),
PROGRAM VARCHAR(256 BYTE),
AUTO_COMMIT BOOLEAN,
LOGON_TIME DATE,
WAIT_SID BINARY_INTEGER,
SQL_EXEC_START DATE,
MODULE VARCHAR(64 BYTE),
EVENT VARCHAR(64 BYTE)
)
PARTITION BY RANGE(CTIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_SESSION_SQL ON WSR_SESSION_SQL(CTIME) LOCAL
TABLESPACE SYSTEM
/

DROP TABLE IF EXISTS WRM$_SNAPSHOT
/

DROP TABLE IF EXISTS WSR_SNAPSHOT
/

CREATE TABLE WSR_SNAPSHOT
(
SNAP_ID BINARY_INTEGER NOT NULL,
DBID BINARY_INTEGER NOT NULL,
INSTANCE_ID BINARY_INTEGER NOT NULL,
STARTUP_TIME TIMESTAMP(3),
SNAP_TIME TIMESTAMP(3) NOT NULL,
FLUSH_ELAPSED INTERVAL DAY(5) TO SECOND(1) NOT NULL,
SESSIONS BINARY_INTEGER NOT NULL,
CURSORS BINARY_INTEGER NOT NULL
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_SNAPSHOT
ADD CONSTRAINT WSR_SNAPSHOT_PK PRIMARY KEY (SNAP_ID, DBID, INSTANCE_ID)
/

DECLARE
I_L_COUNT INT;
BEGIN
SELECT COUNT(*)
INTO I_L_COUNT
FROM MY_SEQUENCES
WHERE SEQUENCE_NAME = UPPER(‘SNAP_ID$’);

IF (I_L_COUNT > 0) THEN
    EXECUTE IMMEDIATE 'DROP SEQUENCE SNAP_ID$';
END IF; 

END;
/

CREATE SEQUENCE SNAP_ID$
MINVALUE 1
NOCACHE
/

DROP VIEW IF EXISTS DBA_HIST_SNAPSHOT
/

CREATE OR REPLACE VIEW ADM_HIST_SNAPSHOT AS
SELECT SNAP_ID, DBID, INSTANCE_ID, STARTUP_TIME,
SNAP_TIME,
FLUSH_ELAPSED, SESSIONS, CURSORS
FROM SYS.WSR_SNAPSHOT
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SNAPSHOT FOR SYS.ADM_HIST_SNAPSHOT
/

DROP TABLE IF EXISTS WRH$_SYSSTAT
/

DROP TABLE IF EXISTS WSR_SYS_STAT
/

CREATE TABLE WSR_SYS_STAT
(
SNAP_ID BINARY_INTEGER NOT NULL,
STAT_ID BINARY_INTEGER NOT NULL,
STAT_NAME VARCHAR(64) NOT NULL,
VALUE BINARY_BIGINT
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_SYS_STAT
ADD CONSTRAINT WSR_SYS_STAT_PK PRIMARY KEY (SNAP_ID, STAT_NAME)
/

DROP VIEW IF EXISTS DBA_HIST_SYSSTAT
/

CREATE OR REPLACE VIEW ADM_HIST_SYSSTAT AS
SELECT S.SNAP_ID, S.STAT_ID, S.STAT_NAME, S.VALUE
FROM SYS.WSR_SYS_STAT S
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SYSSTAT FOR SYS.ADM_HIST_SYSSTAT
/

DROP TABLE IF EXISTS WRH$_SYSTEM
/

DROP TABLE IF EXISTS WSR_SYSTEM
/

CREATE TABLE WSR_SYSTEM
(
SNAP_ID BINARY_INTEGER NOT NULL,
STAT_ID BINARY_INTEGER NOT NULL,
STAT_NAME VARCHAR(64) NOT NULL,
VALUE VARCHAR(128)
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_SYSTEM
ADD CONSTRAINT WSR_SYSTEM_PK PRIMARY KEY (SNAP_ID, STAT_ID)
/

DROP VIEW IF EXISTS DBA_HIST_SYSTEM
/

CREATE OR REPLACE VIEW ADM_HIST_SYSTEM AS
SELECT S.SNAP_ID, S.STAT_ID, S.STAT_NAME, S.VALUE
FROM SYS.WSR_SYSTEM S
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SYSTEM FOR SYS.ADM_HIST_SYSTEM
/

DROP TABLE IF EXISTS WRH$_SYSTEM_EVENT
/

DROP TABLE IF EXISTS WSR_SYSTEM_EVENT
/

CREATE TABLE WSR_SYSTEM_EVENT
(
SNAP_ID BINARY_INTEGER NOT NULL,
EVENT# BINARY_INTEGER NOT NULL,
EVENT VARCHAR(64),
WAIT_CLASS VARCHAR(64),
TOTAL_WAITS VARCHAR(64),
TIME_WAITED BINARY_BIGINT,
TIME_WAITED_MIRCO BINARY_BIGINT,
AVERAGE_WAIT BINARY_DOUBLE,
AVERAGE_WAIT_MIRCO BINARY_BIGINT
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_SYSTEM_EVENT
ADD CONSTRAINT WSR_SYSTEM_EVENT_PK PRIMARY KEY (SNAP_ID, EVENT#)
/

DROP VIEW IF EXISTS DBA_HIST_SYSTEM_EVENT
/

CREATE OR REPLACE VIEW ADM_HIST_SYSTEM_EVENT AS
SELECT S.SNAP_ID, EVENT#, EVENT, WAIT_CLASS, TOTAL_WAITS,
TIME_WAITED, TIME_WAITED_MIRCO, AVERAGE_WAIT, AVERAGE_WAIT_MIRCO
FROM SYS.WSR_SYSTEM_EVENT S
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SYSTEM_EVENT FOR SYS.ADM_HIST_SYSTEM_EVENT
/

DROP TABLE IF EXISTS WRH$_SQLAREA
/

DROP TABLE IF EXISTS WSR_SQLAREA
/

CREATE TABLE WSR_SQLAREA
(
SNAP_ID BINARY_INTEGER NOT NULL,
SQL_ID VARCHAR(10),
SQL_TEXT VARCHAR(8000),
MODULE VARCHAR(64),
EXECUTIONS BINARY_BIGINT,
DISK_READS BINARY_BIGINT,
BUFFER_GETS BINARY_BIGINT,
SORTS BINARY_BIGINT,
PARSE_CALLS BINARY_BIGINT,
PROCESSED_ROWS BINARY_BIGINT,
IO_WAIT_TIME BINARY_BIGINT,
CON_WAIT_TIME BINARY_BIGINT,
CPU_TIME BINARY_BIGINT,
ELAPSED_TIME BINARY_BIGINT,
REF_COUNT BINARY_BIGINT,
IS_FREE BOOLEAN,
CLEANED BOOLEAN,
CR_GETS BINARY_BIGINT,
PARSE_TIME BINARY_BIGINT,
PARSING_USER_NAME VARCHAR(64),
PROGRAM_ID BINARY_BIGINT,
PROGRAM_LINE# BINARY_INTEGER,
VM_PAGES_USED BINARY_BIGINT
)
PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1))
TABLESPACE SYSTEM
/

DROP VIEW IF EXISTS DBA_HIST_SQLAREA
/

CREATE OR REPLACE VIEW ADM_HIST_SQLAREA
AS
SELECT SNAP_ID, SQL_ID, SQL_TEXT, MODULE, EXECUTIONS, DISK_READS,
BUFFER_GETS, SORTS, PARSE_CALLS, PROCESSED_ROWS,
IO_WAIT_TIME, CON_WAIT_TIME, CPU_TIME, ELAPSED_TIME,
REF_COUNT, IS_FREE, CLEANED, CR_GETS, PARSE_TIME, PARSING_USER_NAME, PROGRAM_ID, PROGRAM_LINE#, VM_PAGES_USED
FROM SYS.WSR_SQLAREA
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SQLAREA FOR SYS.ADM_HIST_SQLAREA
/

DROP TABLE IF EXISTS WRH$_PARAMETER
/

DROP TABLE IF EXISTS WSR_PARAMETER
/

CREATE TABLE WSR_PARAMETER
(
SNAP_ID BINARY_INTEGER NOT NULL,
NAME VARCHAR(64) NOT NULL,
VALUE VARCHAR(2048),
RUNTIME_VALUE VARCHAR(2048),
DEFAULT_VALUE VARCHAR(2048),
ISDEFAULT VARCHAR(20),
MODIFIABLE VARCHAR(20),
DESCRIPTION VARCHAR(2048),
RANGE VARCHAR(2048),
DATATYPE VARCHAR(20),
EFFECTIVE VARCHAR(20)
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_PARAMETER
ADD CONSTRAINT WSR_PARAMETER_PK PRIMARY KEY (SNAP_ID, NAME)
/

DROP VIEW IF EXISTS DBA_HIST_PARAMETER
/

CREATE OR REPLACE VIEW ADM_HIST_PARAMETER
AS
SELECT SNAP_ID, NAME, VALUE, RUNTIME_VALUE,DEFAULT_VALUE,
ISDEFAULT, MODIFIABLE, DESCRIPTION, RANGE
DATATYPE, EFFECTIVE
FROM SYS.WSR_PARAMETER
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_PARAMETER FOR SYS.ADM_HIST_PARAMETER
/

DROP TABLE IF EXISTS WSR$_WAITSTAT
/

DROP TABLE IF EXISTS WSR_WAITSTAT
/
CREATE TABLE WSR_WAITSTAT
(
SNAP_ID BINARY_INTEGER NOT NULL,
CLASS VARCHAR(64 BYTE),
COUNT BINARY_INTEGER,
TIME BINARY_INTEGER
)
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_WAITSTAT ON WSR_WAITSTAT(SNAP_ID)
/

DROP TABLE IF EXISTS WSR$_LATCH
/

DROP TABLE IF EXISTS WSR_LATCH
/

DROP VIEW IF EXISTS DBA_HIST_WAITSTAT
/

CREATE OR REPLACE VIEW ADM_HIST_WAITSTAT
AS
SELECT SNAP_ID, CLASS, COUNT, TIME
FROM SYS.WSR_WAITSTAT
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_WAITSTAT FOR SYS.ADM_HIST_WAITSTAT
/

CREATE TABLE WSR_LATCH
(
SNAP_ID BINARY_INTEGER NOT NULL,
ID BINARY_INTEGER,
NAME VARCHAR(64 BYTE),
GETS BINARY_INTEGER,
MISSES BINARY_INTEGER,
SPIN_GETS BINARY_INTEGER,
WAIT_TIME BINARY_INTEGER
)
TABLESPACE SYSTEM
/

ALTER TABLE WSR_LATCH
ADD CONSTRAINT WSR_LATCH_PK PRIMARY KEY (SNAP_ID, ID)
/

DROP TABLE IF EXISTS WSR$_LIBRARYCACHE
/

DROP TABLE IF EXISTS WSR_LIBRARYCACHE
/

DROP VIEW IF EXISTS DBA_HIST_LATCH
/

CREATE OR REPLACE VIEW ADM_HIST_LATCH
AS
SELECT SNAP_ID, ID, NAME, GETS, MISSES, SPIN_GETS, WAIT_TIME
FROM SYS.WSR_LATCH
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_LATCH FOR SYS.ADM_HIST_LATCH
/

CREATE TABLE WSR_LIBRARYCACHE
(
SNAP_ID BINARY_INTEGER NOT NULL,
NAMESPACE VARCHAR(20 BYTE),
GETS BINARY_BIGINT,
GETHITS BINARY_BIGINT,
PINS BINARY_BIGINT,
PINHITS BINARY_BIGINT,
RELOADS BINARY_BIGINT,
INVLIDATIONS BINARY_BIGINT
)
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_LIBRARYCACHE ON WSR_LIBRARYCACHE(SNAP_ID)
/

DROP VIEW IF EXISTS DBA_HIST_LIBRARYCACHE
/

CREATE OR REPLACE VIEW ADM_HIST_LIBRARYCACHE
AS
SELECT SNAP_ID, NAMESPACE, GETS, GETHITS, PINS, PINHITS, RELOADS, INVLIDATIONS
FROM SYS.WSR_LIBRARYCACHE
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_LIBRARYCACHE FOR SYS.ADM_HIST_LIBRARYCACHE
/

DROP TABLE IF EXISTS WSR$_SEGMENT
/

DROP TABLE IF EXISTS WSR_SEGMENT
/

CREATE TABLE WSR_SEGMENT
(
SNAP_ID BINARY_INTEGER NOT NULL,
OWNER VARCHAR(64 BYTE),
OBJECT_NAME VARCHAR(64 BYTE),
SUBOBJECT_NAME VARCHAR(64 BYTE),
TS# BINARY_INTEGER,
OBJECT_TYPE VARCHAR(64 BYTE),
STATISTIC_NAME VARCHAR(64 BYTE),
STATISTIC# BINARY_INTEGER,
VALUE BINARY_INTEGER
)
PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_SEGMENT ON WSR_SEGMENT(STATISTIC#) LOCAL
/

DROP VIEW IF EXISTS DBA_HIST_SEGMENT
/

CREATE OR REPLACE VIEW ADM_HIST_SEGMENT
AS
SELECT SNAP_ID, OWNER, OBJECT_NAME, SUBOBJECT_NAME, TS#, OBJECT_TYPE, STATISTIC_NAME, STATISTIC#, VALUE
FROM SYS.WSR_SEGMENT
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_SEGMENT FOR SYS.ADM_HIST_SEGMENT
/

DROP TABLE IF EXISTS WSR$_DBA_SEGMENTS
/

DROP TABLE IF EXISTS WSR_DBA_SEGMENTS
/

CREATE TABLE WSR_DBA_SEGMENTS
(
SNAP_ID BINARY_INTEGER NOT NULL,
OWNER VARCHAR(64 BYTE),
SEGMENT_NAME VARCHAR(133 BYTE),
PARTITION_NAME VARCHAR(145 BYTE),
SEGMENT_TYPE CHAR(5 BYTE),
TABLESPACE_NAME VARCHAR(64 BYTE),
BYTES BINARY_BIGINT,
PAGES BINARY_BIGINT,
EXTENTS BINARY_BIGINT
)
PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1))
TABLESPACE SYSTEM
/

DROP VIEW IF EXISTS DBA_HIST_DBASEGMENTS
/

CREATE OR REPLACE VIEW ADM_HIST_DBASEGMENTS
AS
SELECT SNAP_ID, OWNER, SEGMENT_NAME, PARTITION_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, PAGES, EXTENTS
FROM SYS.WSR_DBA_SEGMENTS
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_DBASEGMENTS FOR SYS.ADM_HIST_DBASEGMENTS
/

–WSR_SQLTEXT
DROP TABLE IF EXISTS WSR_SQLTEXT
/

CREATE TABLE WSR_SQLTEXT
(
CTIME DATE,
SQL_ID VARCHAR(32 BYTE),
SQL_TEXT VARCHAR(8000 BYTE)
)
PARTITION BY RANGE(CTIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_SQLTEXT ON WSR_SQLTEXT (SQL_ID) LOCAL
TABLESPACE SYSTEM
/

–WSR_SQLPLAN
DROP TABLE IF EXISTS WSR_SQLPLAN
/

CREATE TABLE WSR_SQLPLAN
(
CTIME DATE,
SQL_ID VARCHAR(32 BYTE),
EXPLAIN_ID VARCHAR(32 BYTE),
EXPLAIN_TEXT VARCHAR(8000 BYTE)
)
PARTITION BY RANGE(CTIME) INTERVAL (NUMTODSINTERVAL(1,‘DAY’)) (PARTITION P_0 VALUES LESS THAN (TO_DATE(‘2009-02-01’,‘YYYY-MM-DD’)))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_SQLPLAN ON WSR_SQLPLAN (SQL_ID, EXPLAIN_ID) LOCAL
TABLESPACE SYSTEM
/

–WSR_LONGSQL
DROP TABLE IF EXISTS WSR$_LONGSQL
/

DROP TABLE IF EXISTS WSR_LONGSQL
/

CREATE TABLE WSR_LONGSQL
(
SNAP_ID BINARY_INTEGER NOT NULL,
CTIME DATE,
ELAPSED_TIME NUMBER(38, 2),
SQL_ID VARCHAR(32 BYTE),
EXPLAIN_ID VARCHAR(32 BYTE),
STAGE VARCHAR(12 BYTE),
SQL_TEXT VARCHAR(100)
)
PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_LONGSQL_SQLID ON WSR_LONGSQL(SQL_ID) LOCAL
/

DROP VIEW IF EXISTS DBA_HIST_LONGSQL
/

CREATE OR REPLACE VIEW ADM_HIST_LONGSQL
AS
SELECT SNAP_ID, CTIME, ELAPSED_TIME, SQL_ID, STAGE, SQL_TEXT
FROM SYS.WSR_LONGSQL
/

CREATE OR REPLACE PUBLIC SYNONYM ADM_HIST_LONGSQL FOR SYS.ADM_HIST_LONGSQL
/

DROP TABLE IF EXISTS WSR$SQL_LIST
/

DROP TABLE IF EXISTS WSR_SQL_LIST
/

–WSR_SESSION_EVENTS
DROP TABLE IF EXISTS WSR_SESSION_EVENTS
/

CREATE TABLE WSR_SESSION_EVENTS
(
SNAP_ID BINARY_INTEGER NOT NULL,
SID BINARY_INTEGER,
EVENT# BINARY_INTEGER,
EVENT VARCHAR(64 BYTE),
P1 VARCHAR(64 BYTE),
WAIT_CLASS VARCHAR(64 BYTE),
TOTAL_WAITS BINARY_BIGINT,
TIME_WAITED_MIRCO BINARY_BIGINT
)
PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1))
TABLESPACE SYSTEM
/

CREATE INDEX IX_WSR_SESSION_EVENTS_SID ON WSR_SESSION_EVENTS(SID) LOCAL
/

CREATE GLOBAL TEMPORARY TABLE WSR_SQL_LIST
(
SQL_ID VARCHAR(100) PRIMARY KEY,
SQL_TEXT CLOB
)
ON COMMIT DELETE ROWS
/

DROP TABLE IF EXISTS WSR$SQL_LIST_PLAN
/

DROP TABLE IF EXISTS WSR_SQL_LIST_PLAN
/

CREATE GLOBAL TEMPORARY TABLE WSR_SQL_LIST_PLAN
(
SQL_ID VARCHAR(100) PRIMARY KEY,
ELAPSED_TIME NUMBER(38, 2),
EXPLAIN_TEXT CLOB
)
ON COMMIT DELETE ROWS
/

CREATE OR REPLACE PROCEDURE WSR$INSERT_SQL_LIST
(
STR_SQL_ID IN VARCHAR,
STR_SQL_TEXT IN VARCHAR,
I_IN_STARTSNAPID IN BINARY_INTEGER,
I_IN_ENDSNAPID IN BINARY_INTEGER
)
AS
I_L_COUNT NUMBER(3);
I_L_ELAPSED_TIME NUMBER(38, 2);
STR_L_EXPLAIN_TEXT VARCHAR(8000);
STR_EXPLAIN_ID VARCHAR(32 BYTE);
BEGIN
SELECT COUNT(*)
INTO I_L_COUNT
FROM WSR_SQL_LIST
WHERE SQL_ID = STR_SQL_ID;

IF (I_L_COUNT = 0) THEN

    IF (STR_SQL_TEXT IS NOT NULL AND STR_SQL_TEXT <> '') THEN
    
        INSERT INTO WSR_SQL_LIST
              ( SQL_ID,
                SQL_TEXT
              )
        VALUES( STR_SQL_ID,
                STR_SQL_TEXT
              );
    ELSE
        INSERT INTO WSR_SQL_LIST
              ( SQL_ID,
                SQL_TEXT
              )
        SELECT SQL_ID,
               SQL_TEXT
          FROM WSR_SQLTEXT
         WHERE SQL_ID = STR_SQL_ID
         LIMIT 1;
    END IF;
    
    BEGIN
        SELECT ELAPSED_TIME, EXPLAIN_ID
          INTO I_L_ELAPSED_TIME, STR_EXPLAIN_ID
          FROM WSR_LONGSQL
         WHERE SQL_ID = STR_SQL_ID
           AND SNAP_ID BETWEEN I_IN_STARTSNAPID AND I_IN_ENDSNAPID
         ORDER BY ELAPSED_TIME DESC
         LIMIT 1;        
    
        SELECT SUBSTR(REPLACE(EXPLAIN_TEXT, '"'), 1, 7500)
          INTO STR_L_EXPLAIN_TEXT
          FROM WSR_SQLPLAN
         WHERE SQL_ID = STR_SQL_ID
           AND EXPLAIN_ID = STR_EXPLAIN_ID
         LIMIT 1;
         
        INSERT INTO WSR_SQL_LIST_PLAN
                  ( SQL_ID,
                    ELAPSED_TIME,
                    EXPLAIN_TEXT
                  )
            VALUES( STR_SQL_ID,
                    I_L_ELAPSED_TIME,
                    STR_L_EXPLAIN_TEXT
                  );              
    EXCEPTION
        WHEN OTHERS THEN
            NULL;       
    END;
       
END IF;

END;
/

CREATE OR REPLACE PROCEDURE WSRCREATE_SNAPSHOT AS I_L_SNAP_ID BINARY_INTEGER; I_L_DBID BINARY_INTEGER; I_L_INSTANCE_ID BINARY_INTEGER; DT_L_STARTTIME TIMESTAMP := SYSTIMESTAMP; DT_L_SNAPDAY DATE := TRUNC(SYSDATE); I_L_COUNT BINARY_INTEGER; I_L_RET BINARY_INTEGER; STR_L_SQLTEXT VARCHAR2(8000); BEGIN IF (GET_LOCK('SYS.WSRCREATE_SNAPSHOT’) <> 1) THEN
RETURN;
END IF;

SELECT SNAP_ID$.NEXTVAL
  INTO I_L_SNAP_ID
  FROM SYS_DUMMY;
    
SELECT INSTANCE_ID
  INTO I_L_INSTANCE_ID
  FROM DV_INSTANCE;

SELECT DBID
  INTO I_L_DBID
  FROM DV_DATABASE;

INSERT INTO WSR_SYS_STAT
          ( SNAP_ID,	    
            STAT_ID,	    
            STAT_NAME,
            VALUE
          )
     SELECT I_L_SNAP_ID,
            STATISTIC#,
            NAME,
            VALUE
       FROM DV_SYS_STATS;	    

INSERT INTO WSR_SYSTEM
          ( SNAP_ID,	    
            STAT_ID,	    
            STAT_NAME,
            VALUE
          )
     SELECT I_L_SNAP_ID,
            ID,
            NAME,
            VALUE
       FROM DV_SYSTEM;	   

INSERT INTO WSR_SYSTEM_EVENT
          ( SNAP_ID,	          
            EVENT#,	          
            EVENT,	          
            WAIT_CLASS,	      
            TOTAL_WAITS,	      
            TIME_WAITED,	      
            TIME_WAITED_MIRCO, 
            AVERAGE_WAIT,	  
            AVERAGE_WAIT_MIRCO
          )  
     SELECT I_L_SNAP_ID,
            EVENT#,	          
            EVENT,	          
            WAIT_CLASS,	      
            TOTAL_WAITS,	      
            TIME_WAITED,	      
            TIME_WAITED_MIRCO, 
            AVERAGE_WAIT,	  
            AVERAGE_WAIT_MIRCO
       FROM DV_SYS_EVENTS;	     

INSERT INTO WSR_SYSTEM_EVENT  
          ( SNAP_ID,	          
            EVENT#,	          
            EVENT,	          
            WAIT_CLASS,	      
            TOTAL_WAITS,	      
            TIME_WAITED,	      
            TIME_WAITED_MIRCO, 
            AVERAGE_WAIT,	  
            AVERAGE_WAIT_MIRCO
          )    
     SELECT I_L_SNAP_ID,
            -1,
            'CPU',
            '',
            NULL,
            VALUE/1000000,
            VALUE,
            NULL,
            NULL
       FROM WSR_SYS_STAT
      WHERE SNAP_ID = I_L_SNAP_ID
        AND STAT_ID = 2;    
        
FOR ITEM IN (SELECT SQL_ID,         
                    MIN(SQL_TEXT) SQL_TEXT,
                    MIN(MODULE) MODULE,                
                    SUM(EXECUTIONS) EXECUTIONS,	    
                    SUM(DISK_READS) DISK_READS,	    
                    SUM(BUFFER_GETS) BUFFER_GETS,	    
                    SUM(SORTS) SORTS,	        
                    SUM(PARSE_CALLS) PARSE_CALLS,	    
                    SUM(PROCESSED_ROWS) PROCESSED_ROWS,	
                    SUM(IO_WAIT_TIME) IO_WAIT_TIME,	
                    SUM(CON_WAIT_TIME) CON_WAIT_TIME,	
                    SUM(CPU_TIME) CPU_TIME,	    
                    SUM(ELAPSED_TIME) ELAPSED_TIME,	
                    SUM(REF_COUNT) REF_COUNT,	    
                    SUM(CR_GETS) CR_GETS,
                    SUM(PARSE_TIME) PARSE_TIME,
                    MIN(PARSING_USER_NAME) PARSING_USER_NAME,  
                    MIN(PROGRAM_ID) PROGRAM_ID,
                    MIN(PROGRAM_LINE#) PROGRAM_LINE#,
                    SUM(VM_FREE_PAGES) VM_PAGES_USED
               FROM DV_SQLS
              WHERE EXECUTIONS > 0
    	         GROUP BY SQL_ID) LOOP
    
    BEGIN
        STR_L_SQLTEXT := SUBSTR(ITEM.SQL_TEXT, 1, 7000);
    EXCEPTION
        WHEN OTHERS THEN
            NULL;
    END;
    
    SELECT COUNT(*)
      INTO I_L_COUNT
      FROM WSR_SQLTEXT
     WHERE CTIME = DT_L_SNAPDAY
       AND SQL_ID = ITEM.SQL_ID;	  
    
    IF (I_L_COUNT = 0) THEN
        
        INSERT INTO WSR_SQLTEXT
                  ( CTIME,
                    SQL_ID,
                    SQL_TEXT
                  )
            VALUES( DT_L_SNAPDAY,
                    ITEM.SQL_ID,
                    STR_L_SQLTEXT
                  );
    END IF;                           

    INSERT INTO WSR_SQLAREA
              ( SNAP_ID,	
                SQL_ID,  
                SQL_TEXT,             
                MODULE,                
                EXECUTIONS,	    
                DISK_READS,	    
                BUFFER_GETS,	    
                SORTS,	        
                PARSE_CALLS,	    
                PROCESSED_ROWS,	
                IO_WAIT_TIME,	
                CON_WAIT_TIME,	
                CPU_TIME,	    
                ELAPSED_TIME,	
                REF_COUNT,	    
                IS_FREE,	        
                CLEANED,
                CR_GETS,
                PARSE_TIME,
                PARSING_USER_NAME,  
                PROGRAM_ID,
                PROGRAM_LINE#,
                VM_PAGES_USED
              )
        VALUES( I_L_SNAP_ID,
                ITEM.SQL_ID,     
                SUBSTR(STR_L_SQLTEXT, 1, 30),    
                ITEM.MODULE,                
                ITEM.EXECUTIONS,	    
                ITEM.DISK_READS,	    
                ITEM.BUFFER_GETS,	    
                ITEM.SORTS,	        
                ITEM.PARSE_CALLS,	    
                ITEM.PROCESSED_ROWS,	
                ITEM.IO_WAIT_TIME,	
                ITEM.CON_WAIT_TIME,	
                ITEM.CPU_TIME,	    
                ITEM.ELAPSED_TIME,	
                ITEM.REF_COUNT,	    
                NULL,	        
                NULL,
                ITEM.CR_GETS,
                ITEM.PARSE_TIME,
                ITEM.PARSING_USER_NAME,  
                ITEM.PROGRAM_ID,
                ITEM.PROGRAM_LINE#,
                ITEM.VM_PAGES_USED );	    	

END LOOP;                
       
INSERT INTO WSR_PARAMETER
          ( SNAP_ID, NAME, VALUE, RUNTIME_VALUE, DEFAULT_VALUE,	    
            ISDEFAULT, MODIFIABLE, DESCRIPTION, RANGE,	
            DATATYPE, EFFECTIVE
          )
     SELECT	I_L_SNAP_ID, NAME, VALUE, RUNTIME_VALUE, DEFAULT_VALUE,	    
            ISDEFAULT, MODIFIABLE, DESCRIPTION, RANGE,	
            DATATYPE, EFFECTIVE
       FROM DV_PARAMETERS;	 
       
INSERT INTO WSR_LATCH
          ( SNAP_ID,	  
            ID,        
            NAME,      
            GETS,      
            MISSES,    
            SPIN_GETS, 
            WAIT_TIME
          )
     SELECT I_L_SNAP_ID,
            ID,        
            NAME,      
            GETS,      
            MISSES,    
            SPIN_GETS, 
            WAIT_TIME              
       FROM DV_LATCHS;

INSERT INTO WSR_WAITSTAT
          ( SNAP_ID,	
            CLASS,   
            COUNT,   
            TIME 
          )
     SELECT I_L_SNAP_ID,
            CLASS,   
            COUNT,   
            TIME            
       FROM DV_WAIT_STATS;   
   
INSERT INTO WSR_LIBRARYCACHE
          ( SNAP_ID,	    
            NAMESPACE,   
            GETS,        
            GETHITS,     
            PINS,        
            PINHITS,     
            RELOADS,     
            INVLIDATIONS
          )
     SELECT I_L_SNAP_ID,
            NAMESPACE,   
            GETS,        
            GETHITS,     
            PINS,        
            PINHITS,     
            RELOADS,     
            INVLIDATIONS           
       FROM DV_LIBRARY_CACHE;
   
INSERT INTO WSR_SEGMENT
          ( SNAP_ID,	      
            OWNER,         
            OBJECT_NAME,   
            SUBOBJECT_NAME,
            TS#,           
            OBJECT_TYPE,   
            STATISTIC_NAME,
            STATISTIC#,    
            VALUE
          )
     SELECT I_L_SNAP_ID, 
            OWNER,         
            OBJECT_NAME,   
            SUBOBJECT_NAME,
            TS#,           
            OBJECT_TYPE,   
            STATISTIC_NAME,
            STATISTIC#,    
            VALUE
       FROM DV_SEGMENT_STATS
      WHERE VALUE > 0;    

INSERT INTO WSR_DBA_SEGMENTS
          (
            SNAP_ID,	                                   
            OWNER,                                      
            SEGMENT_NAME,                               
            PARTITION_NAME,                             
            SEGMENT_TYPE,                               
            TABLESPACE_NAME,                            
            BYTES,                                      
            PAGES,                                      
            EXTENTS                                    
          )            
     SELECT I_L_SNAP_ID,
            OWNER,                                      
            SEGMENT_NAME,                               
            PARTITION_NAME,                             
            SEGMENT_TYPE,                               
            TABLESPACE_NAME,                            
            BYTES,                                      
            PAGES,                                      
            EXTENTS 
       FROM ADM_SEGMENTS
      WHERE PAGES > 0;

 FOR ITEM IN ( SELECT I_L_SNAP_ID,
               TO_DATE(CTIME, 'YYYY-MM-DD HH24:MI:SS') CTIME,
               ELAPSED_TIME,
               SQL_ID,
               EXPLAIN_ID,
               EXPLAIN_TEXT,
               STAGE,
               SQL_TEXT
          FROM DV_LONG_SQL
         WHERE CTIME <= TO_CHAR(DT_L_STARTTIME :: DATE, 'YYYY-MM-DD HH24:MI:SS')
           AND CTIME > TO_CHAR((SELECT MOST_RECENT_SNAP_TIME :: DATE FROM WSR_CONTROL), 'YYYY-MM-DD HH24:MI:SS')) LOOP
 
    BEGIN
        STR_L_SQLTEXT := SUBSTR(ITEM.SQL_TEXT, 2, 7000);
    EXCEPTION
        WHEN OTHERS THEN
            NULL;
    END;     
 
     INSERT INTO WSR_LONGSQL
      				  (
        					SNAP_ID,
        					CTIME,
        					ELAPSED_TIME,
        					SQL_ID,
        					EXPLAIN_ID,
             STAGE,
             SQL_TEXT
      				  )
     VALUES( I_L_SNAP_ID,
             ITEM.CTIME,
             ITEM.ELAPSED_TIME,
             ITEM.SQL_ID,
             ITEM.EXPLAIN_ID,
             ITEM.STAGE,
             SUBSTR(STR_L_SQLTEXT, 1, 30)
           ); 
    
    SELECT COUNT(*)
      INTO I_L_COUNT
      FROM WSR_SQLTEXT
     WHERE CTIME = DT_L_SNAPDAY
       AND SQL_ID = ITEM.SQL_ID;	  
    
    IF (I_L_COUNT = 0) THEN
        
        INSERT INTO WSR_SQLTEXT
                  ( CTIME,
                    SQL_ID,
                    SQL_TEXT
                  )
            VALUES( DT_L_SNAPDAY,
                    ITEM.SQL_ID,
                    STR_L_SQLTEXT
                  );
    END IF;
    
    IF (ITEM.EXPLAIN_ID <> '0000000000') THEN    
        SELECT COUNT(*)
          INTO I_L_COUNT
          FROM WSR_SQLPLAN
         WHERE CTIME = DT_L_SNAPDAY
           AND EXPLAIN_ID = ITEM.EXPLAIN_ID
           AND SQL_ID = ITEM.SQL_ID;	  
        
        IF (I_L_COUNT = 0) THEN
            
            INSERT INTO WSR_SQLPLAN
                      ( CTIME,
                        SQL_ID,
                        EXPLAIN_ID,
                        EXPLAIN_TEXT
                      )
                VALUES( DT_L_SNAPDAY,
                        ITEM.SQL_ID,
                        ITEM.EXPLAIN_ID,
                        ITEM.EXPLAIN_TEXT
                      );
        END IF;        
    END IF;
END LOOP;                 

INSERT INTO WSR_SNAPSHOT
      ( SNAP_ID,
        DBID,
        INSTANCE_ID,
        STARTUP_TIME,
        SNAP_TIME,
        FLUSH_ELAPSED,
        SESSIONS,
        CURSORS
      )
VALUES( I_L_SNAP_ID,
        I_L_DBID,
        I_L_INSTANCE_ID,
        (SELECT STARTUP_TIME FROM DV_INSTANCE),
        DT_L_STARTTIME,
        NUMTODSINTERVAL((SYSDATE - CAST (DT_L_STARTTIME AS DATE)) * 86400, 'SECOND'),
        (SELECT COUNT(*) FROM DV_SESSIONS),
        (SELECT COUNT(*) FROM DV_OPEN_CURSORS)
      );	
      
INSERT INTO WSR_SESSION_EVENTS
          ( SNAP_ID,
            SID,
            EVENT#,
            EVENT,
            P1,
            WAIT_CLASS,
            TOTAL_WAITS,
            TIME_WAITED_MIRCO
          )
     SELECT I_L_SNAP_ID,
            SID,
            EVENT#,
            EVENT,
            P1,
            WAIT_CLASS,
            TOTAL_WAITS,
            TIME_WAITED_MIRCO
       FROM DV_SESSION_EVENTS
      WHERE WAIT_CLASS <> 'Idle';
      
UPDATE WSR_CONTROL SET MOST_RECENT_SNAP_TIME = DT_L_STARTTIME, MOST_RECENT_SNAP_ID = I_L_SNAP_ID;      

COMMIT;                

I_L_RET := RELEASE_LOCK('SYS.WSR$CREATE_SNAPSHOT');

EXCEPTION
WHEN OTHERS THEN
I_L_RET := RELEASE_LOCK('SYS.WSRCREATESNAPSHOT);WSRCREATE_SNAPSHOT'); WSRINSERT_ERRORLOG(‘WSR$CREATE_SNAPSHOT’, SUBSTR(SQLERRM,1,2000));
END;
/

CREATE OR REPLACE PROCEDURE WSR$DROP_SNAPSHOT_PARTITION
(
STR_IN_TABLENAME IN VARCHAR,
I_IN_SNAPID IN INTEGER
)
AS
STR_L_PARTITION VARCHAR(200);
BEGIN
SELECT PARTITION_NAME
INTO STR_L_PARTITION
FROM ADM_TAB_PARTITIONS
WHERE TABLE_OWNER = ‘SYS’
AND TABLE_NAME = UPPER(STR_IN_TABLENAME)
AND HIGH_VALUE = TO_CHAR(I_IN_SNAPID + 1);

EXECUTE IMMEDIATE 'ALTER TABLE ' || STR_IN_TABLENAME || ' DROP PARTITION ' || STR_L_PARTITION;   

EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
WSRINSERTERRORLOG(WSRINSERT_ERRORLOG('WSRDROP_SNAPSHOT_PARTITION’, SUBSTR(SQLERRM,1,2000));
END WSR$DROP_SNAPSHOT_PARTITION;
/

CREATE OR REPLACE PROCEDURE WSR$DROP_SNAPSHOT_RANGE
(
LOW_SNAP_ID IN BINARY_INTEGER,
HIGH_SNAP_ID IN BINARY_INTEGER
)
AS
BEGIN
IF (LOW_SNAP_ID IS NULL OR HIGH_SNAP_ID IS NULL) THEN
RAISE_APPLICATION_ERROR(-20000, ‘LOW_SNAP_ID & HIGH_SNAP_ID CAN’‘T BE NULL!’);
END IF;

FOR I IN LOW_SNAP_ID .. HIGH_SNAP_ID LOOP

    DELETE FROM WSR_SNAPSHOT
     WHERE SNAP_ID = I;

    DELETE FROM WSR_SYS_STAT
     WHERE SNAP_ID = I;        

    DELETE FROM WSR_SYSTEM
     WHERE SNAP_ID = I; 
     
    DELETE FROM WSR_SYSTEM_EVENT
     WHERE SNAP_ID = I;                     
    
    DELETE FROM WSR_PARAMETER
     WHERE SNAP_ID = I;      
    
    DELETE FROM WSR_LATCH
     WHERE SNAP_ID = I;    
     
    DELETE FROM WSR_WAITSTAT
     WHERE SNAP_ID = I;  
     
    DELETE FROM WSR_LIBRARYCACHE
     WHERE SNAP_ID = I;   
     
    WSR$DROP_SNAPSHOT_PARTITION('WSR_SQLAREA', I); 
    WSR$DROP_SNAPSHOT_PARTITION('WSR_SEGMENT', I); 
    WSR$DROP_SNAPSHOT_PARTITION('WSR_DBA_SEGMENTS', I); 
    WSR$DROP_SNAPSHOT_PARTITION('WSR_LONGSQL', I); 
    WSR$DROP_SNAPSHOT_PARTITION('WSR_SESSION_EVENTS', I);
     
    COMMIT;

END LOOP;  

END;
/

CREATE OR REPLACE PROCEDURE WSR$DROP_CTIME_PARTITION
(
STR_IN_TABLENAME IN VARCHAR,
I_IN_DAYS IN BINARY_INTEGER
)
AS
DT_L_HIGHVALUE DATE := TRUNC(SYSDATE - I_IN_DAYS);
STR_L_HIGHVALUE VARCHAR(200);
I_L_COUNT BINARY_INTEGER;
BEGIN
FOR ITEM IN (
SELECT PARTITION_NAME, HIGH_VALUE
FROM ADM_TAB_PARTITIONS
WHERE TABLE_OWNER = ‘SYS’
AND TABLE_NAME = UPPER(STR_IN_TABLENAME)
AND PARTITION_NAME <> ‘P_0’) LOOP

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SYS_DUMMY WHERE TO_DATE(''' || ITEM.HIGH_VALUE || ''', ''YYYY-MM-DD HH24:MI:SS'') <= :1 ' INTO I_L_COUNT USING DT_L

_HIGHVALUE;

    IF (I_L_COUNT > 0) THEN        
        EXECUTE IMMEDIATE 'ALTER TABLE ' || STR_IN_TABLENAME || ' DROP PARTITION ' || ITEM.PARTITION_NAME; 
    END IF;      

END LOOP;

EXCEPTION
WHEN OTHERS THEN
WSRINSERTERRORLOG(WSRINSERT_ERRORLOG('WSRDROP_CTIME_PARTITION’, SUBSTR(SQLERRM,1,2000));
END;
/

CREATE OR REPLACE PROCEDURE WSR$DROP_SNAPSHOT_TIME
AS
I_L_DAYS BINARY_INTEGER;
I_L_LOGDAYS BINARY_INTEGER;
BEGIN
SELECT RETENTION_NUM / 86400, LOG_DAYS
INTO I_L_DAYS, I_L_LOGDAYS
FROM WSR_CONTROL;

FOR ITEM IN (SELECT SNAP_ID FROM ADM_HIST_SNAPSHOT WHERE SNAP_TIME < SYSDATE - I_L_DAYS) LOOP
       WSR$DROP_SNAPSHOT_RANGE(ITEM.SNAP_ID, ITEM.SNAP_ID);
   END LOOP;
   
   WSR$DROP_CTIME_PARTITION('WSR_SQLTEXT', I_L_DAYS);
   WSR$DROP_CTIME_PARTITION('WSR_SQLPLAN', I_L_DAYS);
   WSR$DROP_CTIME_PARTITION('WSR_INSTANCE_SNAP', I_L_DAYS);
   WSR$DROP_CTIME_PARTITION('WSR_SESSION_SQL', I_L_DAYS);
   WSR$DROP_CTIME_PARTITION('WSR_TRANSACTION', I_L_DAYS);
   WSR$DROP_CTIME_PARTITION('WSR_LOCK_OBJECT', I_L_DAYS);
   
   DELETE FROM WSR_EXCEPTION_LOG 
    WHERE CTIME < SYSDATE - I_L_LOGDAYS;

   UPDATE WSR_CONTROL SET MOST_RECENT_PURGE_TIME = CURRENT_TIMESTAMP;

   COMMIT;

EXCEPTION
WHEN OTHERS THEN
WSRINSERTERRORLOG(WSRINSERT_ERRORLOG('WSRDROP_SNAPSHOT_TIME’, SUBSTR(SQLERRM,1,2000));
END;
/

CREATE OR REPLACE PROCEDURE WSR$MODIFIY_SETTING
(
I_IN_INTERVAL_MINUTES IN BINARY_INTEGER DEFAULT NULL,
I_IN_RETENTION_DAYS IN BINARY_INTEGER DEFAULT NULL,
I_IN_TOPSQL IN BINARY_INTEGER DEFAULT NULL,
STR_IN_STATUS IN VARCHAR DEFAULT NULL,
STR_IN_SESSION_STATUS IN VARCHAR DEFAULT NULL,
I_IN_SESSION_INTERVAL IN BINARY_INTEGER DEFAULT NULL,
I_IN_LOG_DAYS IN BINARY_INTEGER DEFAULT NULL
)
AS
I_L_COUNT BINARY_INTEGER;
I_L_JOBNO BINARY_INTEGER;
STR_L_INTERVAL VARCHAR(1000);
I_L_SNAPINT_NUM BINARY_INTEGER;
I_SESSION_INTERVAL BINARY_INTEGER;
BEGIN
IF (I_IN_INTERVAL_MINUTES < 5 OR I_IN_INTERVAL_MINUTES > 1440) THEN
RAISE_APPLICATION_ERROR(-20000, ‘I_IN_INTERVAL_MINUTES SHOULD BETWEEN 5 AND 1440!’);
END IF;

   IF (I_IN_RETENTION_DAYS < 1 OR I_IN_RETENTION_DAYS > 3000) THEN
    RAISE_APPLICATION_ERROR(-20000, 'I_IN_RETENTION_DAYS SHOULD BETWEEN 1 AND 3000!');
END IF;

   IF (I_IN_TOPSQL < 1 OR I_IN_TOPSQL > 1000) THEN
    RAISE_APPLICATION_ERROR(-20000, 'I_IN_TOPSQL SHOULD BETWEEN 1 AND 1000!');
END IF;

   IF (STR_IN_SESSION_STATUS NOT IN ('Y', 'N')) THEN
    RAISE_APPLICATION_ERROR(-20000, 'STR_IN_SESSION_STATUS SHOULD BE Y OR N!');
END IF;

IF (I_IN_SESSION_INTERVAL < 1 OR I_IN_SESSION_INTERVAL > 1000) THEN
    RAISE_APPLICATION_ERROR(-20000, 'I_IN_TOPSQL SHOULD BETWEEN 1 AND 1000!');
END IF;

   IF (STR_IN_STATUS NOT IN ('Y', 'N')) THEN
    RAISE_APPLICATION_ERROR(-20000, 'STR_IN_STATUS SHOULD BE Y OR N!');
END IF;

IF (I_IN_LOG_DAYS < 1 OR I_IN_LOG_DAYS > 1000) THEN
    RAISE_APPLICATION_ERROR(-20000, 'I_IN_LOG_DAYS SHOULD BETWEEN 1 AND 1000!');
END IF;    

UPDATE WSR_CONTROL
      SET SNAP_INTERVAL = NVL(NUMTODSINTERVAL(I_IN_INTERVAL_MINUTES, 'MINUTE'), SNAP_INTERVAL),
          SNAPINT_NUM = NVL(I_IN_INTERVAL_MINUTES * 60, SNAPINT_NUM),
	         RETENTION = NVL(NUMTODSINTERVAL(I_IN_RETENTION_DAYS, 'DAY'), RETENTION),
       RETENTION_NUM = NVL(I_IN_RETENTION_DAYS * 86400, RETENTION_NUM), 
	         TOPNSQL = NVL(I_IN_TOPSQL, TOPNSQL),
	         STATUS = NVL(STR_IN_STATUS, STATUS),
	         SESSION_STATUS = NVL(STR_IN_SESSION_STATUS, SESSION_STATUS),
	         SESSION_INTERVAL = NVL(I_IN_SESSION_INTERVAL, SESSION_INTERVAL),
	         LOG_DAYS = NVL(I_IN_LOG_DAYS, LOG_DAYS);

   IF (I_IN_SESSION_INTERVAL IS NOT NULL) THEN

       BEGIN
		         SELECT JOB
     			  INTO I_L_JOBNO
     			  FROM MY_JOBS
     			 WHERE WHAT = 'WSR$CREATE_SESSION_SNAPSHOT();'
     			   AND ROWNUM <= 1;
		
        DBMS_JOB.REMOVE(I_L_JOBNO);   			
    EXCEPTION  
  		    WHEN NO_DATA_FOUND THEN
  	         NULL;	
  		END;
	
	    STR_L_INTERVAL := 'SYSDATE + ' || I_IN_SESSION_INTERVAL || '/86400';
	
	    DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SESSION_SNAPSHOT();', SYSDATE, STR_L_INTERVAL);

    END IF;

   IF (STR_IN_SESSION_STATUS IS NOT NULL) THEN

  		BEGIN
     			SELECT JOB
     			  INTO I_L_JOBNO
     			  FROM MY_JOBS
     			 WHERE WHAT = 'WSR$CREATE_SESSION_SNAPSHOT();'
     			   AND ROWNUM <= 1;  			
  		EXCEPTION  
     			WHEN NO_DATA_FOUND THEN
     			
        	   SELECT SESSION_INTERVAL
        	     INTO I_SESSION_INTERVAL 
        	     FROM WSR_CONTROL;
        	
        	   DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SESSION_SNAPSHOT();', SYSDATE, 'SYSDATE + ' || TO_CHAR(I_SESSION_INTERVAL) || '/86400');
  		END;

  		IF (STR_IN_SESSION_STATUS = 'Y') THEN
  		   DBMS_JOB.BROKEN(JOB => I_L_JOBNO, BROKEN => FALSE);
  		ELSE
       DBMS_JOB.BROKEN(JOB => I_L_JOBNO, BROKEN => TRUE);		
  		END IF;

   END IF;

   IF (I_IN_INTERVAL_MINUTES IS NOT NULL) THEN

       BEGIN
		         SELECT JOB
     			  INTO I_L_JOBNO
     			  FROM MY_JOBS
     			 WHERE WHAT = 'WSR$CREATE_SNAPSHOT();'
     			   AND ROWNUM <= 1;
		
        DBMS_JOB.REMOVE(I_L_JOBNO);   			
    EXCEPTION  
  		    WHEN NO_DATA_FOUND THEN
  	         NULL;	
  		END;
	
	    STR_L_INTERVAL := 'SYSDATE + ' || I_IN_INTERVAL_MINUTES || '/1440';
	
	    DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SNAPSHOT();', SYSDATE, STR_L_INTERVAL);

    END IF;

   IF (STR_IN_STATUS IS NOT NULL) THEN

  		BEGIN
     			SELECT JOB
     			  INTO I_L_JOBNO
     			  FROM MY_JOBS
     			 WHERE WHAT = 'WSR$CREATE_SNAPSHOT();'
     			   AND ROWNUM <= 1;  			
  		EXCEPTION  
     			WHEN NO_DATA_FOUND THEN
     			
            SELECT SNAPINT_NUM
              INTO I_L_SNAPINT_NUM
              FROM WSR_CONTROL;
        	
        	   DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SNAPSHOT();', TRUNC(SYSDATE, 'HH') + 1/24, 'SYSDATE + ' || TO_CHAR(I_L_SNAPINT_NUM) || '/86400' );
  		END;

  		IF (STR_IN_STATUS = 'Y') THEN
  		   DBMS_JOB.BROKEN(JOB => I_L_JOBNO, BROKEN => FALSE);
  		ELSE
       DBMS_JOB.BROKEN(JOB => I_L_JOBNO, BROKEN => TRUE);		
  		END IF;

   END IF;

   COMMIT;

END;
/

CREATE OR REPLACE PROCEDURE WSRMODIFYSETTING(IININTERVALMINUTESINBINARYINTEGERDEFAULTNULL,IINRETENTIONDAYSINBINARYINTEGERDEFAULTNULL,IINTOPSQLINBINARYINTEGERDEFAULTNULL,STRINSTATUSINVARCHARDEFAULTNULL,STRINSESSIONSTATUSINVARCHARDEFAULTNULL,IINSESSIONINTERVALINBINARYINTEGERDEFAULTNULL,IINLOGDAYSINBINARYINTEGERDEFAULTNULL)ASBEGINWSRMODIFY_SETTING ( I_IN_INTERVAL_MINUTES IN BINARY_INTEGER DEFAULT NULL, I_IN_RETENTION_DAYS IN BINARY_INTEGER DEFAULT NULL, I_IN_TOPSQL IN BINARY_INTEGER DEFAULT NULL, STR_IN_STATUS IN VARCHAR DEFAULT NULL, STR_IN_SESSION_STATUS IN VARCHAR DEFAULT NULL, I_IN_SESSION_INTERVAL IN BINARY_INTEGER DEFAULT NULL, I_IN_LOG_DAYS IN BINARY_INTEGER DEFAULT NULL ) AS BEGIN WSRMODIFIY_SETTING(I_IN_INTERVAL_MINUTES, I_IN_RETENTION_DAYS, I_IN_TOPSQL, STR_IN_STATUS, STR_IN_SESSION_STATUS, I_IN_SESSION_INTERVAL, I_IN_LOG_DAYS);
END;
/

DECLARE
I_L_COUNT INT;
BEGIN
SELECT COUNT(*)
INTO I_L_COUNT
FROM SYS_ROLES
WHERE NAME = ‘STATISTICS’;

IF (I_L_COUNT = 0) THEN
    EXECUTE IMMEDIATE 'CREATE ROLE STATISTICS';
ELSE
    SELECT COUNT(*) INTO I_L_COUNT FROM ADM_TAB_PRIVS WHERE GRANTEE = 'STATISTICS' AND OBJECT_NAME = 'DBMS_JOB';
    IF (I_L_COUNT > 0) THEN
        EXECUTE IMMEDIATE 'REVOKE EXECUTE ON DBMS_JOB FROM STATISTICS';
    END IF;
    
    SELECT COUNT(*) INTO I_L_COUNT FROM ADM_TAB_PRIVS WHERE GRANTEE = 'STATISTICS' AND OBJECT_NAME = 'WSR$MODIFY_SETTING' AND OWNER = 'SYS';
    IF (I_L_COUNT > 0) THEN
        EXECUTE IMMEDIATE 'REVOKE EXECUTE ON WSR$MODIFY_SETTING FROM STATISTICS';
    END IF;
    
    SELECT COUNT(*) INTO I_L_COUNT FROM ADM_TAB_PRIVS WHERE GRANTEE = 'STATISTICS' AND OBJECT_NAME = 'WSR$MODIFIY_SETTING' AND OWNER = 'SYS';
    IF (I_L_COUNT > 0) THEN
        EXECUTE IMMEDIATE 'REVOKE EXECUTE ON WSR$MODIFIY_SETTING FROM STATISTICS';
    END IF;
END IF;

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_ELAPSED_TIME
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           EXECUTIONS,
           TO_CHAR(ELAPSED_TIME / EXECUTIONS / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, ELAPSED_TIME / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = B.SQL_ID LIMIT 1), '''', ''''''),
           TO_CHAR(BUFFER_GETS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(DISK_READS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(PROCESSED_ROWS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(PARSE_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CR_GETS / EXECUTIONS, 'FM99999999999999999990.000'),
           PARSING_USER_NAME,
           PROGRAM_LINE#,
           NVL((SELECT OBJECT_NAME FROM ADM_PROCEDURES WHERE OBJECT_ID = PROGRAM_ID LIMIT 1), '&nbsp'),
           TO_CHAR(CON_WAIT_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(VM_PAGES_USED / EXECUTIONS, 'FM99999999999999999990.000')     
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.SQL_ID,
                           B.MODULE,
                           B.BUFFER_GETS - NVL(A.BUFFER_GETS, 0) BUFFER_GETS,
                           B.DISK_READS - NVL(A.DISK_READS, 0) DISK_READS,
                           B.PROCESSED_ROWS - NVL(A.PROCESSED_ROWS, 0) PROCESSED_ROWS,
                           B.PARSE_TIME - NVL(A.PARSE_TIME, 0) PARSE_TIME,
                           B.CON_WAIT_TIME - NVL(A.CON_WAIT_TIME, 0) CON_WAIT_TIME,
                           B.CR_GETS - NVL(A.CR_GETS, 0) CR_GETS,
                           B.PARSING_USER_NAME,
                           B.PROGRAM_LINE#,
                           B.PROGRAM_ID,
                           B.SQL_TEXT,
                           B.VM_PAGES_USED - NVL(A.VM_PAGES_USED, 0) VM_PAGES_USED
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID) 
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0) B
     ORDER BY ELAPSED_TIME DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_LONGSQL_TIME
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT COUNT(CASE WHEN STAGE IN ('EXECUTE', 'QUERY', 'PREP_EXEC') THEN 1 ELSE 0 END) EXECUTIONS,
           TO_CHAR(SUM(ELAPSED_TIME) / 1000, 'FM99999999999999999990.000'),
           TO_CHAR(MAX(CASE WHEN STAGE IN ('EXECUTE', 'QUERY', 'PREP_EXEC') THEN ELAPSED_TIME ELSE 0 END) / 1000, 'FM99999999999999999990.000') MAX_EXEC,
           COUNT(CASE WHEN STAGE = 'PARSE' THEN 1 ELSE 0 END) PARSES,
           TO_CHAR(SUM(CASE WHEN STAGE = 'PARSE' THEN ELAPSED_TIME ELSE 0 END)/ 1000, 'FM99999999999999999990.000') PARSE_TIME,
           COUNT(CASE WHEN STAGE = 'FETCH' THEN 1 ELSE 0 END) FETCHS,
           TO_CHAR(SUM(CASE WHEN STAGE = 'FETCH' THEN ELAPSED_TIME ELSE 0 END)/ 1000, 'FM99999999999999999990.000') FETCH_TIME,
           SQL_ID,
           MIN(SQL_TEXT) || '...',
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = A.SQL_ID LIMIT 1), '''', '''''')
      FROM ADM_HIST_LONGSQL A
     WHERE SNAP_ID > I_IN_LOW_SNAP_ID AND SNAP_ID <= I_IN_HIGH_SNAP_ID 
     GROUP BY SQL_ID
     ORDER BY SUM(ELAPSED_TIME) DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_LONGSQL_TIME_PREFIX
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER,
I_IN_LETTER_NUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT COUNT(CASE WHEN STAGE IN ('EXECUTE', 'QUERY', 'PREP_EXEC') THEN 1 ELSE 0 END) EXECUTIONS,
           TO_CHAR(SUM(ELAPSED_TIME) / 1000, 'FM99999999999999999990.000'),
           TO_CHAR(MAX(CASE WHEN STAGE IN ('EXECUTE', 'QUERY', 'PREP_EXEC') THEN ELAPSED_TIME ELSE 0 END) / 1000, 'FM99999999999999999990.000') MAX_EXEC,
           COUNT(CASE WHEN STAGE = 'PARSE' THEN 1 ELSE 0 END) PARSES,
           TO_CHAR(SUM(CASE WHEN STAGE = 'PARSE' THEN ELAPSED_TIME ELSE 0 END)/ 1000, 'FM99999999999999999990.000') PARSE_TIME,
           COUNT(CASE WHEN STAGE = 'FETCH' THEN 1 ELSE 0 END) FETCHS,
           TO_CHAR(SUM(CASE WHEN STAGE = 'FETCH' THEN ELAPSED_TIME ELSE 0 END)/ 1000, 'FM99999999999999999990.000') FETCH_TIME,
           SQL_TEXT
      FROM( SELECT SUBSTR(SQL_TEXT, 1, I_IN_LETTER_NUM) SQL_TEXT, STAGE, ELAPSED_TIME
              FROM ADM_HIST_LONGSQL A
             WHERE SNAP_ID > I_IN_LOW_SNAP_ID AND SNAP_ID <= I_IN_HIGH_SNAP_ID
           ) 
     GROUP BY SQL_TEXT
     ORDER BY SUM(ELAPSED_TIME) DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_CPU_TIME
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT TO_CHAR(CPU_TIME / 1000000, 'FM99999999999999999990.000'),
           EXECUTIONS,
           TO_CHAR(CPU_TIME / EXECUTIONS / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, CPU_TIME / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = B.SQL_ID LIMIT 1), '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.SQL_ID,
                           B.SQL_TEXT,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0) B
     ORDER BY CPU_TIME DESC, 5 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_IO_WAIT
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT TO_CHAR(IO_TIME / 1000000, 'FM99999999999999999990.000'),
           EXECUTIONS,
           TO_CHAR(IO_TIME / EXECUTIONS / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, IO_TIME / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = B.SQL_ID LIMIT 1), '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.SQL_ID,
                           B.SQL_TEXT,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0) B
     ORDER BY IO_TIME DESC, 5 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_GETS
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT BUFFER_GETS,
           EXECUTIONS,
           TO_CHAR(BUFFER_GETS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, BUFFER_GETS / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = B.SQL_ID LIMIT 1), '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.BUFFER_GETS - NVL(A.BUFFER_GETS, 0) BUFFER_GETS,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.SQL_ID,
                           B.SQL_TEXT,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0) B
     ORDER BY 1 DESC, 5 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_READS
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT DISK_READS,
           EXECUTIONS,
           TO_CHAR(DISK_READS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, DISK_READS / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE((SELECT SQL_TEXT FROM WSR_SQLTEXT WHERE SQL_ID = B.SQL_ID LIMIT 1), '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.BUFFER_GETS - NVL(A.BUFFER_GETS, 0) BUFFER_GETS,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.DISK_READS - NVL(A.DISK_READS, 0) DISK_READS,
                           B.SQL_ID,
                           B.SQL_TEXT,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0) B
     ORDER BY 1 DESC, 5 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_EXECUTIONS
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT EXECUTIONS,
           PROCESSED_ROWS,
           TO_CHAR(PROCESSED_ROWS / EXECUTIONS, 'FM99999999999999999990.000'),
           TO_CHAR(ELAPSED_TIME / 1000000, 'FM99999999999999999990.000'),
           TO_CHAR(CPU_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           TO_CHAR(IO_TIME / ELAPSED_TIME * 100, 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE(SQL_TEXT, '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.BUFFER_GETS - NVL(A.BUFFER_GETS, 0) BUFFER_GETS,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.PROCESSED_ROWS - NVL(A.PROCESSED_ROWS, 0) PROCESSED_ROWS,
                           B.SQL_TEXT,
                           B.SQL_ID,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0)
     ORDER BY 1 DESC, 4 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSQL_PARSES
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOTAL IN BINARY_BIGINT,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT PARSE_CALLS,
           EXECUTIONS,
           TO_CHAR(DECODE(I_IN_TOTAL, 0, 0 :: BINARY_BIGINT, PARSE_CALLS / I_IN_TOTAL * 100), 'FM99999999999999999990.000'),
           SQL_TEXT || '...',
           SQL_ID,
           MODULE,
           REPLACE(SQL_TEXT, '''', '''''')
      FROM (SELECT *
              FROM (SELECT B.ELAPSED_TIME - NVL(A.ELAPSED_TIME, 0) ELAPSED_TIME,
                           B.EXECUTIONS - NVL(A.EXECUTIONS, 0) EXECUTIONS,
                           B.CPU_TIME - NVL(A.CPU_TIME, 0) CPU_TIME,
                           B.BUFFER_GETS - NVL(A.BUFFER_GETS, 0) BUFFER_GETS,
                           B.IO_WAIT_TIME - NVL(A.IO_WAIT_TIME, 0) IO_TIME,
                           B.PARSE_CALLS - NVL(A.PARSE_CALLS, 0) PARSE_CALLS,
                           B.SQL_TEXT,
                           B.SQL_ID,
                           B.MODULE
                      FROM (SELECT * FROM ADM_HIST_SQLAREA WHERE SNAP_ID = I_IN_HIGH_SNAP_ID) B
                      LEFT JOIN ADM_HIST_SQLAREA A
                        ON A.SNAP_ID = I_IN_LOW_SNAP_ID
                       AND A.SQL_ID = B.SQL_ID)
             WHERE ELAPSED_TIME > 0
               AND EXECUTIONS > 0)
     ORDER BY 1 DESC, 2 DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSESSION_TOPEVENT
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER,
I_IN_SID IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN
OPEN CUR_RESULT FOR
SELECT EVENT,
TO_CHAR(TIME_WAITED_MIRCO/1000000, ‘FM99999999999999999990.000’),
TOTAL_WAITS,
TO_CHAR(TIME_WAITED_MIRCO/TOTAL_WAITS/1000, ‘FM99999999999999999990.000’)
FROM (SELECT *
FROM (SELECT B.TOTAL_WAITS - NVL(A.TOTAL_WAITS, 0) TOTAL_WAITS,
B.TIME_WAITED_MIRCO - NVL(A.TIME_WAITED_MIRCO, 0) TIME_WAITED_MIRCO,
B.EVENT
FROM (SELECT * FROM SYS.WSR_SESSION_EVENTS WHERE SNAP_ID = I_IN_HIGH_SNAP_ID AND SID = I_IN_SID) B
LEFT JOIN (SELECT * FROM SYS.WSR_SESSION_EVENTS WHERE SNAP_ID = I_IN_LOW_SNAP_ID AND SID = I_IN_SID) A
ON A.EVENT = B.EVENT)
WHERE TOTAL_WAITS > 0
AND TIME_WAITED_MIRCO > 0)
ORDER BY TIME_WAITED_MIRCO DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);    

END;
/

CREATE OR REPLACE PROCEDURE WSR$TOPSESSION
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
BEGIN

OPEN CUR_RESULT FOR
    SELECT SID,
           TO_CHAR(TIME_WAITED_MIRCO/1000000, 'FM99999999999999999990.000'),
           TOTAL_WAITS
      FROM (SELECT *
              FROM (SELECT B.TOTAL_WAITS - NVL(A.TOTAL_WAITS, 0) TOTAL_WAITS,
                           B.TIME_WAITED_MIRCO - NVL(A.TIME_WAITED_MIRCO, 0) TIME_WAITED_MIRCO,
                           B.SID
                      FROM (SELECT SID, SUM(TOTAL_WAITS) TOTAL_WAITS, SUM(TIME_WAITED_MIRCO) TIME_WAITED_MIRCO FROM SYS.WSR_SESSION_EVENTS WHERE SNAP_ID = I_IN

_HIGH_SNAP_ID GROUP BY SID) B
LEFT JOIN (SELECT SID, SUM(TOTAL_WAITS) TOTAL_WAITS, SUM(TIME_WAITED_MIRCO) TIME_WAITED_MIRCO FROM SYS.WSR_SESSION_EVENTS WHERE SNAP_ID =
I_IN_LOW_SNAP_ID GROUP BY SID) A
ON A.SID = B.SID)
WHERE TOTAL_WAITS > 0
AND TIME_WAITED_MIRCO > 0)
ORDER BY TIME_WAITED_MIRCO DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$QUERY_TOPSESSION_SQL
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
DT_L_STARTTIME DATE;
DT_L_ENDTIME DATE;
BEGIN

SELECT SNAP_TIME
  INTO DT_L_STARTTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_LOW_SNAP_ID;
 
SELECT SNAP_TIME
  INTO DT_L_ENDTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_HIGH_SNAP_ID; 

OPEN CUR_RESULT FOR
    SELECT NVL(TO_CHAR((CTIME - SQL_EXEC_START) *86400, 'FM99999999999999999990.000'), '&nbsp'), 
           SID,                          
           NVL(TO_CHAR(SQL_ID), '&nbsp'),                              
           CURR_SCHEMA,                         
           CLIENT_IP,                           
           NVL(TRIM(PROGRAM), '&nbsp'),                              
           AUTO_COMMIT,                         
           TO_CHAR(LOGON_TIME, 'YYYY-MM-DD HH24:MI:SS'),                         
           NVL(TO_CHAR(WAIT_SID), '&nbsp'),                               
           NVL(TO_CHAR(SQL_EXEC_START, 'YYYY-MM-DD HH24:MI:SS'), '&nbsp'),     
           TO_CHAR(CTIME, 'YYYY-MM-DD HH24:MI:SS'),                 
           MODULE,                              
           EVENT, 
           (SELECT SUBSTR(SQL_TEXT, 1, 30) FROM WSR_SQLTEXT WHERE SQL_ID = A.SQL_ID LIMIT 1) || '...'
      FROM (SELECT CTIME,
                   SID,                          
                   SQL_ID,                              
                   CURR_SCHEMA,                         
                   CLIENT_IP,                           
                   PROGRAM,                             
                   AUTO_COMMIT,                         
                   LOGON_TIME,                         
                   WAIT_SID,                            
                   SQL_EXEC_START,                     
                   MODULE,                              
                   EVENT,                               
                   ROW_NUMBER() OVER(PARTITION BY SID, SQL_ID, SQL_EXEC_START ORDER BY CTIME DESC) RK
              FROM WSR_SESSION_SQL
             WHERE CTIME BETWEEN DT_L_STARTTIME AND DT_L_ENDTIME
               AND SQL_EXEC_START IS NOT NULL) A
     WHERE RK = 1
     ORDER BY CTIME - SQL_EXEC_START DESC LIMIT I_IN_TOPNUM;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$QUERY_TRANSACTION
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER,
I_IN_TOPNUM IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
DT_L_STARTTIME DATE;
DT_L_ENDTIME DATE;
BEGIN

SELECT SNAP_TIME
  INTO DT_L_STARTTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_LOW_SNAP_ID;
 
SELECT SNAP_TIME
  INTO DT_L_ENDTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_HIGH_SNAP_ID; 

OPEN CUR_RESULT FOR
    SELECT NVL(TO_CHAR((SNAP_TIME - BEGIN_TIME) *86400, 'FM99999999999999999990.000'), '&nbsp'), 
           SID,                          
           UNDO_COUNT,                                                                           
           TO_CHAR(BEGIN_TIME, 'YYYY-MM-DD HH24:MI:SS'),                                                     
           NVL(TO_CHAR(SNAP_TIME, 'YYYY-MM-DD HH24:MI:SS'), '&nbsp'),
           NVL(SQL_ID, '&nbsp'),
           (SELECT SUBSTR(SQL_TEXT, 1, 30) FROM WSR_SQLTEXT WHERE SQL_ID = A.SQL_ID LIMIT 1) || '...',
           NVL((SELECT GROUP_CONCAT(OBJECT_NAME) FROM (SELECT OBJECT_NAME FROM WSR_LOCK_OBJECT WHERE SNAP_TIME = A.SNAP_TIME AND SID = A.SID LIMIT 20)), '&nbsp

')
FROM( SELECT (SELECT SQL_ID FROM WSR_SESSION_SQL WHERE CTIME = SNAP_TIME LIMIT 1) SQL_ID,
SNAP_TIME,
SID,
UNDO_COUNT,
BEGIN_TIME
FROM (SELECT SNAP_TIME,
SID,
UNDO_COUNT,
BEGIN_TIME,
ROW_NUMBER() OVER(PARTITION BY SID, BEGIN_TIME ORDER BY SNAP_TIME DESC) RK
FROM WSR_TRANSACTION
WHERE SNAP_TIME BETWEEN DT_L_STARTTIME AND DT_L_ENDTIME) A
WHERE RK = 1
ORDER BY SNAP_TIME - BEGIN_TIME DESC LIMIT I_IN_TOPNUM
) A;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

CREATE OR REPLACE PROCEDURE WSR$WRITE_INSTANCE_SNAP
AS
I_L_SESSION_NUM BINARY_INTEGER;
I_L_ACTIVE_SESS_NUM BINARY_INTEGER;
I_L_TS_SYSTEM_FREE BINARY_BIGINT;
I_L_TS_SYSWARE_FREE BINARY_BIGINT;
I_L_TS_USER_FREE BINARY_BIGINT;
I_L_TXN_PAGES BINARY_INTEGER;
I_L_UNDO_PAGES BINARY_INTEGER;
BEGIN
SELECT COUNT(*), COUNT(DECODE(STATUS, ‘ACTIVE’, 1, NULL))
INTO I_L_SESSION_NUM, I_L_ACTIVE_SESS_NUM
FROM DV_SESSIONS;

SELECT SUM(DECODE(TABLESPACE_NAME, 'SYSTEM', TOTAL_SIZE - USED_SIZE, 0)), SUM(DECODE(TABLESPACE_NAME, 'SYSWARE', TOTAL_SIZE - USED_SIZE, 0)),
       SUM(CASE WHEN TABLESPACE_NAME IN ('SYSTEM', 'SYSWARE', 'TEMP', 'UNDO', 'TEMP2', 'TEMP2_UNDO') THEN 0 ELSE TOTAL_SIZE - USED_SIZE END)  
  INTO I_L_TS_SYSTEM_FREE, I_L_TS_SYSWARE_FREE, I_L_TS_USER_FREE
  FROM ADM_TABLESPACES;

SELECT SUM(TXN_PAGES), SUM(UNDO_PAGES)
  INTO I_L_TXN_PAGES, I_L_UNDO_PAGES
  FROM DV_UNDO_SEGMENTS;      

INSERT INTO WSR_INSTANCE_SNAP
          ( SNAP_TIME,                        
            SESSION_NUM,                      
            ACTIVE_SESS_NUM,                  
            LOCK_NUM,                         
            TRANSACTION_NUM,                  
            TEMP_BUFFER_FREE,                 
            DATA_BUFFER_PIN,                  
            TS_SYSTEM_FREE,                   
            TS_SYSWARE_FREE,                       
            TS_USER_FREE,                        
            TXN_PAGES,                        
            UNDO_PAGES                       
          )
    VALUES( SYSDATE,
            I_L_SESSION_NUM,
            I_L_ACTIVE_SESS_NUM,
            (SELECT COUNT(*) FROM DV_LOCKS),
            (SELECT COUNT(*) FROM DV_TRANSACTIONS),
            (SELECT SUM(FREE_PAGES) FROM DV_TEMP_POOLS),
            (SELECT SUM(CNUM_PINNED) FROM DV_BUFFER_POOL_STATS),
            I_L_TS_SYSTEM_FREE, 
            I_L_TS_SYSWARE_FREE, 
            I_L_TS_USER_FREE,
            I_L_TXN_PAGES,
            I_L_UNDO_PAGES
          );
            
COMMIT;

END;
/

CREATE OR REPLACE PROCEDURE WSRCREATE_SESSION_SNAPSHOT AS DT_L_CURRENT DATE := SYSDATE; DT_L_DAY DATE := TRUNC(SYSDATE); I_L_COUNT BINARY_INTEGER; I_L_RET BINARY_INTEGER; BEGIN IF (GET_LOCK('SYS.WSRCREATE_SNAPSHOT’) <> 1) THEN
RETURN;
END IF;

SELECT COUNT(*) 
  INTO I_L_COUNT
  FROM WSR_CONTROL
 WHERE STATUS = 'Y'
   AND SESSION_STATUS = 'Y';

IF (I_L_COUNT = 0) THEN
    RETURN;
END IF;

FOR ITEM IN (SELECT * FROM DV_SESSIONS WHERE STATUS = 'ACTIVE' AND (CLIENT_IP <> '0.0.0.0' OR EVENT <> 'idle wait')) LOOP

    INSERT INTO SYS.WSR_SESSION_SQL
              ( CTIME,
                SID,          
                SQL_ID,         
                CURR_SCHEMA,    
                CLIENT_IP,      
                PROGRAM,        
                AUTO_COMMIT,    
                LOGON_TIME,     
                WAIT_SID,       
                SQL_EXEC_START, 
                MODULE,         
                EVENT          
              )
        VALUES( DT_L_CURRENT,
                ITEM.SID,
                ITEM.SQL_ID,
                ITEM.CURR_SCHEMA,
                ITEM.CLIENT_IP,      
                ITEM.PROGRAM,        
                ITEM.AUTO_COMMIT,    
                ITEM.LOGON_TIME,     
                ITEM.WAIT_SID,       
                ITEM.SQL_EXEC_START, 
                ITEM.MODULE,         
                ITEM.EVENT
               );
    
    IF (ITEM.SQL_ID IS NOT NULL) THEN
    
        SELECT COUNT(*)
          INTO I_L_COUNT
          FROM SYS.WSR_SQLTEXT
         WHERE CTIME = DT_L_DAY
           AND SQL_ID = ITEM.SQL_ID;	  
        
        IF (I_L_COUNT = 0) THEN
            
            INSERT INTO SYS.WSR_SQLTEXT
                      ( CTIME,
                        SQL_ID,
                        SQL_TEXT
                      )
                VALUES( DT_L_DAY,
                        ITEM.SQL_ID,
                        ITEM.CURRENT_SQL
                      );
        END IF;          
    END IF;
END LOOP;

INSERT INTO WSR_TRANSACTION
          ( SNAP_TIME,
            SID,
            UNDO_COUNT,
            BEGIN_TIME
          )
     SELECT DT_L_CURRENT,
            SID,
            UNDO_COUNT,
            BEGIN_TIME
       FROM DV_TRANSACTIONS;       
       
INSERT INTO WSR_LOCK_OBJECT
          ( SNAP_TIME,
            SID,
            OBJECT_NAME,
            LMODE 
          )
     SELECT DT_L_CURRENT,
            SESSION_ID,
            OBJECT_NAME,
            LMODE 
       FROM DV_LOCKED_OBJECTS;                               

WSR$WRITE_INSTANCE_SNAP;
I_L_RET := RELEASE_LOCK('SYS.WSR$CREATE_SNAPSHOT');

EXCEPTION
WHEN OTHERS THEN
I_L_RET := RELEASE_LOCK('SYS.WSRCREATESNAPSHOT);WSRCREATE_SNAPSHOT'); WSRINSERT_ERRORLOG(‘WSR$CREATE_SESSION_SNAPSHOT’, SUBSTR(SQLERRM,1,2000));
END;
/

CREATE OR REPLACE PROCEDURE WSR$INSTANCE_SNAP
(
I_IN_LOW_SNAP_ID IN BINARY_INTEGER,
I_IN_HIGH_SNAP_ID IN BINARY_INTEGER
)
AS
CUR_RESULT SYS_REFCURSOR;
DT_L_STARTTIME DATE;
DT_L_ENDTIME DATE;
BEGIN

SELECT SNAP_TIME
  INTO DT_L_STARTTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_LOW_SNAP_ID;
 
SELECT SNAP_TIME
  INTO DT_L_ENDTIME
  FROM ADM_HIST_SNAPSHOT
 WHERE SNAP_ID = I_IN_HIGH_SNAP_ID;     

OPEN CUR_RESULT FOR
    SELECT  TO_CHAR(SNAP_TIME, 'YYYY-MM-DD HH24:MI:SS'),                        
            SESSION_NUM,                      
            ACTIVE_SESS_NUM,                  
            LOCK_NUM,                         
            TRANSACTION_NUM,                  
            TEMP_BUFFER_FREE,                 
            DATA_BUFFER_PIN,                  
            TS_SYSTEM_FREE,                   
            TS_SYSWARE_FREE,                       
            TS_USER_FREE,                        
            TXN_PAGES,                        
            UNDO_PAGES 
      FROM SYS.WSR_INSTANCE_SNAP
     WHERE SNAP_TIME BETWEEN DT_L_STARTTIME AND DT_L_ENDTIME
     ORDER BY SNAP_TIME LIMIT 1000;

DBMS_SQL.RETURN_RESULT(CUR_RESULT);

END;
/

DECLARE
I_L_JOBNO BINARY_INTEGER;
I_L_SNAPINT_NUM BINARY_INTEGER;
STR_L_STATUS VARCHAR(3);
BEGIN
FOR ITEM IN (
SELECT JOB
FROM MY_JOBS
WHERE WHAT = ‘WSR$CREATE_SNAPSHOT();’ ) LOOP

    DBMS_JOB.REMOVE(ITEM.JOB);		
END LOOP;

SELECT SNAPINT_NUM, STATUS
  INTO I_L_SNAPINT_NUM, STR_L_STATUS
  FROM WSR_CONTROL;

   DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SNAPSHOT();', TRUNC(SYSDATE, 'HH') + 1/24, 'SYSDATE + ' || TO_CHAR(I_L_SNAPINT_NUM) || '/86400' );
   
   IF (STR_L_STATUS = 'N') THEN
       DBMS_JOB.BROKEN(I_L_JOBNO, TRUE);
   END IF; 
   
   COMMIT;

END;
/

DECLARE
I_L_JOBNO BINARY_INTEGER;
BEGIN
FOR ITEM IN (
SELECT JOB
FROM MY_JOBS
WHERE WHAT = ‘WSR$DROP_SNAPSHOT_TIME();’ ) LOOP

    DBMS_JOB.REMOVE(ITEM.JOB);		
END LOOP;	

   DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$DROP_SNAPSHOT_TIME();', TRUNC(SYSDATE) + 1, 'TRUNC(SYSDATE) + 1');
   COMMIT;

END;
/

DECLARE
I_L_JOBNO BINARY_INTEGER;
I_SESSION_INTERVAL BINARY_INTEGER;
STR_L_SESSION_STATUS VARCHAR(3);
BEGIN
FOR ITEM IN (
SELECT JOB
FROM MY_JOBS
WHERE WHAT = ‘WSR$CREATE_SESSION_SNAPSHOT();’ ) LOOP

    DBMS_JOB.REMOVE(ITEM.JOB);		
END LOOP;
   
   SELECT SESSION_INTERVAL, SESSION_STATUS
     INTO I_SESSION_INTERVAL, STR_L_SESSION_STATUS 
     FROM WSR_CONTROL
    LIMIT 1;
   
   DBMS_JOB.SUBMIT(I_L_JOBNO, 'WSR$CREATE_SESSION_SNAPSHOT();', SYSDATE, 'SYSDATE + ' || TO_CHAR(I_SESSION_INTERVAL) || '/86400');
   
   IF (STR_L_SESSION_STATUS = 'N') THEN
       DBMS_JOB.BROKEN(I_L_JOBNO, TRUE);
   END IF; 
   
   COMMIT;

END;
/

GRANT EXECUTE ON SYS.WSRCREATESNAPSHOTTOSTATISTICS/GRANTSELECTONSYS.SNAPIDCREATE_SNAPSHOT TO STATISTICS / GRANT SELECT ON SYS.SNAP_ID TO STATISTICS
/
GRANT SELECT ON SYS.DV_INSTANCE TO STATISTICS
/
GRANT SELECT ON SYS.DV_DATABASE TO STATISTICS
/
GRANT UPDATE, INSERT, SELECT ON SYS.WSR_CONTROL TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_SYS_STAT TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_SYSTEM TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_SYSTEM_EVENT TO STATISTICS
/
GRANT SELECT ON SYS.DV_SYS_STATS TO STATISTICS
/
GRANT SELECT ON SYS.DV_SYSTEM TO STATISTICS
/
GRANT SELECT ON SYS.DV_SYS_EVENTS TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SQLAREA TO STATISTICS
/
GRANT SELECT ON SYS.DV_SQLS TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_PARAMETER TO STATISTICS
/
GRANT SELECT ON SYS.DV_PARAMETERS TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_LATCH TO STATISTICS
/
GRANT SELECT ON SYS.DV_LATCHS TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_WAITSTAT TO STATISTICS
/
GRANT SELECT ON SYS.DV_WAIT_STATS TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_LIBRARYCACHE TO STATISTICS
/
GRANT SELECT ON SYS.DV_LIBRARY_CACHE TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SEGMENT TO STATISTICS
/
GRANT SELECT ON SYS.DV_SEGMENT_STATS TO STATISTICS
/
GRANT INSERT, SELECT, DELETE ON SYS.WSR_SNAPSHOT TO STATISTICS
/
GRANT SELECT ON SYS.DV_SESSIONS TO STATISTICS
/
GRANT SELECT ON SYS.DV_OPEN_CURSORS TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_DBA_SEGMENTS TO STATISTICS
/
GRANT SELECT ON SYS.ADM_SEGMENTS TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_SQLAREA TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_SNAPSHOT TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_WR_CONTROL TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_SYSSTAT TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_SYSTEM_EVENT TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_SYSTEM TO STATISTICS
/
GRANT EXECUTE ON SYS.WSR$INSERT_SQL_LIST TO STATISTICS
/
GRANT SELECT ON SYS.ADM_HIST_PARAMETER TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SQL_LIST TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SQL_LIST_PLAN TO STATISTICS
/
GRANT EXECUTE ON DBMS_JOB TO STATISTICS
/

GRANT SELECT ON SYS.ADM_HIST_LONGSQL TO STATISTICS
/
GRANT SELECT ON SYS.DV_LONG_SQL TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_LONGSQL TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SQLTEXT TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SQLPLAN TO STATISTICS
/
GRANT EXECUTE ON WSRTOPSQLELAPSEDTIMETOSTATISTICS/GRANTEXECUTEONWSRTOPSQL_ELAPSED_TIME TO STATISTICS / GRANT EXECUTE ON WSRTOPSQL_LONGSQL_TIME TO STATISTICS
/
GRANT EXECUTE ON WSRTOPSQLLONGSQLTIMEPREFIXTOSTATISTICS/GRANTEXECUTEONWSRTOPSQL_LONGSQL_TIME_PREFIX TO STATISTICS / GRANT EXECUTE ON WSRTOPSQL_CPU_TIME TO STATISTICS
/
GRANT EXECUTE ON WSRTOPSQLIOWAITTOSTATISTICS/GRANTEXECUTEONWSRTOPSQL_IO_WAIT TO STATISTICS / GRANT EXECUTE ON WSRTOPSQL_GETS TO STATISTICS
/
GRANT EXECUTE ON WSRTOPSQLREADSTOSTATISTICS/GRANTEXECUTEONWSRTOPSQL_READS TO STATISTICS / GRANT EXECUTE ON WSRTOPSQL_EXECUTIONS TO STATISTICS
/
GRANT EXECUTE ON WSR$TOPSQL_PARSES TO STATISTICS
/
GRANT STATISTICS TO DBA
/

GRANT INSERT, SELECT ON SYS.WSR_INSTANCE_SNAP TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SESSION_SQL TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_EXCEPTION_LOG TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_SESSION_EVENTS TO STATISTICS
/
GRANT INSERT, SELECT ON SYS.WSR_TRANSACTION TO STATISTICS
/
GRANT EXECUTE ON WSRINSERTERRORLOGTOSTATISTICS/GRANTEXECUTEONWSRINSERT_ERRORLOG TO STATISTICS / GRANT EXECUTE ON WSRTOPSESSION_TOPEVENT TO STATISTICS
/
GRANT EXECUTE ON WSRTOPSESSIONTOSTATISTICS/GRANTEXECUTEONWSRTOPSESSION TO STATISTICS / GRANT EXECUTE ON WSRQUERY_TOPSESSION_SQL TO STATISTICS
/
GRANT EXECUTE ON WSRWRITEINSTANCESNAPTOSTATISTICS/GRANTEXECUTEONWSRWRITE_INSTANCE_SNAP TO STATISTICS / GRANT EXECUTE ON WSRCREATE_SESSION_SNAPSHOT TO STATISTICS
/
GRANT EXECUTE ON WSR$INSTANCE_SNAP TO STATISTICS
/

GRANT EXECUTE ON WSR$QUERY_TRANSACTION TO STATISTICS
/
GRANT SELECT ON ADM_TABLESPACES TO STATISTICS
/
GRANT SELECT ON DV_UNDO_SEGMENTS TO STATISTICS
/
GRANT SELECT ON DV_LOCKS TO STATISTICS
/
GRANT SELECT ON DV_TRANSACTIONS TO STATISTICS
/
GRANT SELECT ON DV_TEMP_POOLS TO STATISTICS
/
GRANT SELECT ON DV_BUFFER_POOL_STATS TO STATISTICS
/
GRANT SELECT ON DV_SESSION_EVENTS TO STATISTICS
/
GRANT SELECT ON DV_LOCKED_OBJECTS TO STATISTICS
/

BEGIN
EXECUTE IMMEDIATE ‘REVOKE EXECUTE ON SYS.WSRDROPSNAPSHOTRANGEFROMSTATISTICS;EXCEPTIONWHENOTHERSTHENNULL;END;/BEGINEXECUTEIMMEDIATEREVOKEEXECUTEONSYS.WSRDROP_SNAPSHOT_RANGE FROM STATISTICS'; EXCEPTION WHEN OTHERS THEN NULL; END; / BEGIN EXECUTE IMMEDIATE 'REVOKE EXECUTE ON SYS.WSRDROP_SNAPSHOT_PARTITION FROM STATISTICS’;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
BEGIN
EXECUTE IMMEDIATE ‘REVOKE EXECUTE ON WSRDROPCTIMEPARTITIONFROMSTATISTICS;EXCEPTIONWHENOTHERSTHENNULL;END;/BEGINEXECUTEIMMEDIATEREVOKEEXECUTEONWSRDROP_CTIME_PARTITION FROM STATISTICS'; EXCEPTION WHEN OTHERS THEN NULL; END; / BEGIN EXECUTE IMMEDIATE 'REVOKE EXECUTE ON WSRDROP_SNAPSHOT_TIME FROM STATISTICS’;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论