PACKAGE BODY dbms_addm IS
PROCEDURE VALIDATE_TASK(TASK_NAME_IN IN OUT VARCHAR2) IS TID NUMBER; STATUS_T VARCHAR2(11);
BEGIN SELECT MAX(STATUS) INTO STATUS_T FROM USER_ADVISOR_TASKS WHERE ADVISOR_NAME = 'ADDM' AND TASK_NAME = TASK_NAME_IN; IF STATUS_T IS NULL THEN DBMS_ADVISOR.CREATE_TASK('ADDM', TID, TASK_NAME_IN); RETURN; ELSIF STATUS_T = 'COMPLETED' OR STATUS_T = 'EXECUTING' THEN RETURN;
ELSIF STATUS_T <> 'INITIAL' THEN DBMS_ADVISOR.RESET_TASK(TASK_NAME_IN); END IF; END;
PROCEDURE ANALYZE_DB ( TASK_NAME IN OUT VARCHAR2, BEGIN_SNAPSHOT IN NUMBER, END_SNAPSHOT IN NUMBER, DB_ID IN NUMBER := NULL) IS
BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); VALIDATE_TASK(TASK_NAME); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'START_SNAPSHOT', BEGIN_SNAPSHOT); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'END_SNAPSHOT', END_SNAPSHOT); IF DB_ID IS NOT NULL THEN DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'DB_ID', DB_ID); END IF; DBMS_ADVISOR.EXECUTE_TASK(TASK_NAME); END;
PROCEDURE ANALYZE_INST ( TASK_NAME IN OUT VARCHAR2, BEGIN_SNAPSHOT IN NUMBER, END_SNAPSHOT IN NUMBER, INSTANCE_NUMBER IN NUMBER := NULL, DB_ID IN NUMBER := NULL) IS INST_ID NUMBER; DBID NUMBER;
BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
VALIDATE_TASK(TASK_NAME); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'START_SNAPSHOT', BEGIN_SNAPSHOT); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'END_SNAPSHOT', END_SNAPSHOT);
INST_ID := INSTANCE_NUMBER; DBID := DB_ID;
IF DB_ID IS NOT NULL THEN DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'DB_ID', DBID); END IF;
IF INST_ID IS NULL THEN SELECT DBMS_UTILITY.CURRENT_INSTANCE INTO INST_ID FROM DUAL; END IF; DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'INSTANCE', INST_ID);
DBMS_ADVISOR.EXECUTE_TASK(TASK_NAME); END;
PROCEDURE ANALYZE_PARTIAL ( TASK_NAME IN OUT VARCHAR2, INSTANCE_NUMBERS IN VARCHAR2, BEGIN_SNAPSHOT IN NUMBER, END_SNAPSHOT IN NUMBER, DB_ID IN NUMBER := NULL) IS
BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
VALIDATE_TASK(TASK_NAME); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'INSTANCES', INSTANCE_NUMBERS); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'START_SNAPSHOT', BEGIN_SNAPSHOT); DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'END_SNAPSHOT', END_SNAPSHOT); IF DB_ID IS NOT NULL THEN DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME, 'DB_ID', DB_ID); END IF; DBMS_ADVISOR.EXECUTE_TASK(TASK_NAME); END;
PROCEDURE INSERT_FINDING_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2, FINDING_NAME IN VARCHAR2, MIN_ACTIVE_SESSIONS IN NUMBER := 0, MIN_PERC_IMPACT IN NUMBER := 0) IS DIR_ID NUMBER; DIR_TEXT VARCHAR2(2000); CNT NUMBER;
TASK_NAME_CPY VARCHAR2(100) := TASK_NAME;
BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); IF MIN_ACTIVE_SESSIONS IS NULL OR MIN_ACTIVE_SESSIONS < 0 THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13704, NVL(TO_CHAR(MIN_ACTIVE_SESSIONS),'NULL'), 'MIN_ACTIVE_SESSION'); END IF; IF MIN_PERC_IMPACT IS NULL OR MIN_PERC_IMPACT < 0 OR MIN_PERC_IMPACT >100 THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13704, NVL(TO_CHAR(MIN_PERC_IMPACT),'NULL'), 'MIN_PERC_IMPACT'); END IF;
IF NOT PRVT_ADVISOR.FINDING_NAME_EXISTS('ADDM',FINDING_NAME) THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13713, FINDING_NAME); END IF;
IF TASK_NAME IS NOT NULL THEN VALIDATE_TASK(TASK_NAME_CPY); END IF;
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Finding Filter');
DIR_TEXT := ' ' || ' ' || ' ' || FINDING_NAME || ' ' || ' ' || ' ' || ' ' || MIN_ACTIVE_SESSIONS || ' ' || ' ' || ' ' || ' ' || MIN_PERC_IMPACT || ' ' || ' ' || '';
DBMS_ADVISOR.INSERT_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME, DIR_TEXT); END;
PROCEDURE INSERT_SQL_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2, SQL_ID IN VARCHAR2, MIN_ACTIVE_SESSIONS IN NUMBER := 0, MIN_RESPONSE_TIME IN NUMBER := 0) IS DIR_ID NUMBER; DIR_TEXT VARCHAR2(2000); I NUMBER; C VARCHAR2(1);
TASK_NAME_CPY VARCHAR2(100) := TASK_NAME; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
IF SQL_ID IS NULL THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13704, 'NULL', 'SQL_ID'); END IF; IF MIN_ACTIVE_SESSIONS IS NULL OR MIN_ACTIVE_SESSIONS < 0 THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13704, NVL(TO_CHAR(MIN_ACTIVE_SESSIONS),'NULL'), 'MIN_ACTIVE_SESSION'); END IF; IF MIN_RESPONSE_TIME IS NULL OR MIN_RESPONSE_TIME < 0 THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13704, NVL(TO_CHAR(MIN_RESPONSE_TIME),'NULL'), 'MIN_RESPONSE_TIME'); END IF;
IF LENGTH(SQL_ID) <> 13 THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13714, SQL_ID); END IF; FOR I IN 1..13 LOOP C := SUBSTR(SQL_ID, I, 1); IF NOT ((C >= '0' AND C <= '9') OR (C >= 'a' AND C <= 'z')) THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13714, SQL_ID); END IF; END LOOP;
IF TASK_NAME IS NOT NULL THEN VALIDATE_TASK(TASK_NAME_CPY); END IF;
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'SQL Filter');
DIR_TEXT := ' ' || ' ' || ' ' || SQL_ID || ' ' || ' ' || ' ' || ' ' || MIN_ACTIVE_SESSIONS || ' ' || ' ' || ' ' || ' ' || MIN_RESPONSE_TIME || ' ' || ' ' || '';
DBMS_ADVISOR.INSERT_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME, DIR_TEXT); END;
PROCEDURE INSERT_SEGMENT_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2, OWNER_NAME IN VARCHAR2, OBJECT_NAME IN VARCHAR2 := NULL, SUB_OBJECT_NAME IN VARCHAR2 := NULL) IS DIR_ID NUMBER; DIR_TEXT VARCHAR2(2000); NAME1 VARCHAR2(100); NAME2 VARCHAR2(100); NAME3 VARCHAR2(100);
TASK_NAME_CPY VARCHAR2(100) := TASK_NAME; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); IF OWNER_NAME IS NULL THEN NAME1 := '%'; ELSE NAME1 := LOWER(OWNER_NAME); END IF; IF OBJECT_NAME IS NULL THEN NAME2 := '%'; ELSE NAME2 := LOWER(OBJECT_NAME); END IF; IF SUB_OBJECT_NAME IS NULL THEN NAME3 := '%'; ELSE NAME3 := LOWER(SUB_OBJECT_NAME); END IF;
IF TASK_NAME IS NOT NULL THEN VALIDATE_TASK(TASK_NAME_CPY); END IF;
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Segment Filter');
DIR_TEXT := ' ' || ' ' || ' ' || NAME1 || ' ' || ' ' || ' ' || ' ' || NAME2 || ' ' || ' ' || ' ' || ' ' || NAME3 || ' ' || ' ' || ' ' || ' 0 ' || ' ' || '';
DBMS_ADVISOR.INSERT_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME, DIR_TEXT); END;
PROCEDURE INSERT_SEGMENT_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2, OBJECT_NUMBER IN NUMBER)
IS DIR_ID NUMBER; DIR_TEXT VARCHAR2(2000);
TASK_NAME_CPY VARCHAR2(100) := TASK_NAME; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
IF TASK_NAME IS NOT NULL THEN VALIDATE_TASK(TASK_NAME_CPY); END IF;
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Segment Filter');
DIR_TEXT := ' ' || ' ' || ' 0 ' || ' ' || ' ' || ' 0 ' || ' ' || ' ' || ' 0 ' || ' ' || ' ' || ' ' || OBJECT_NUMBER || ' ' || ' ' || '';
DBMS_ADVISOR.INSERT_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME, DIR_TEXT); END;
PROCEDURE INSERT_PARAMETER_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2, PARAMETER_NAME IN VARCHAR2)
IS DIR_ID NUMBER; DIR_TEXT VARCHAR2(2000); CNT NUMBER; PN VARCHAR2(300) := LOWER(PARAMETER_NAME);
TASK_NAME_CPY VARCHAR2(100) := TASK_NAME; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
IF TASK_NAME IS NOT NULL THEN VALIDATE_TASK(TASK_NAME_CPY); END IF;
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Parameter Filter');
IF NOT PRVT_HDM.PARAMETER_EXISTS(PN) THEN DBMS_SYS_ERROR.RAISE_SYSTEM_ERROR(-13715, NVL(PARAMETER_NAME, 'NULL')); END IF;
DIR_TEXT := ' ' || ' ' || ' ' || PN || ' ' || ' ' || '';
DBMS_ADVISOR.INSERT_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME, DIR_TEXT); END;
PROCEDURE DELETE_FINDING_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2) IS DIR_ID NUMBER; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Finding Filter'); DBMS_ADVISOR.DELETE_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME); END;
PROCEDURE DELETE_SQL_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2) IS DIR_ID NUMBER; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'SQL Filter');
DBMS_ADVISOR.DELETE_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME); END;
PROCEDURE DELETE_SEGMENT_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2) IS DIR_ID NUMBER; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Segment Filter'); DBMS_ADVISOR.DELETE_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME); END;
PROCEDURE DELETE_PARAMETER_DIRECTIVE ( TASK_NAME IN VARCHAR2, DIR_NAME IN VARCHAR2) IS DIR_ID NUMBER; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC');
DIR_ID := PRVT_ADVISOR.GET_DIRECTIVE_ID('ADDM', 'Parameter Filter'); DBMS_ADVISOR.DELETE_DIRECTIVE(DIR_ID, DIR_NAME, TASK_NAME); END;
PROCEDURE DELETE ( TASK_NAME IN VARCHAR2) IS CURSOR TNAMES(TN VARCHAR2) IS SELECT TASK_NAME FROM USER_ADVISOR_TASKS WHERE TASK_NAME = TN AND ADVISOR_NAME = 'ADDM'; BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); FOR T IN TNAMES(TASK_NAME) LOOP DBMS_ADVISOR.DELETE_TASK(T.TASK_NAME); END LOOP; END;
FUNCTION GET_REPORT ( TASK_NAME IN VARCHAR2) RETURN CLOB IS BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); RETURN DBMS_ADVISOR.GET_TASK_REPORT(TASK_NAME); END;
FUNCTION GET_ASH_QUERY ( TASK_NAME IN VARCHAR2, FINDING_ID IN NUMBER) RETURN VARCHAR2 IS BEGIN DBMS_MANAGEMENT_PACKS.CHECK_PACK_ENABLED('DIAGNOSTIC'); DBMS_ADVISOR.CHECK_PRIVS; PRVT_ADVISOR.CHECK_TASK_ENABLED(TASK_NAME, DBMS_ADVISOR.ADV_NAME_ADDM, FALSE); RETURN PRVT_HDM.GET_ASH_QUERY(TASK_NAME, FINDING_ID); END;
END DBMS_ADDM;
|