DECLARE L_FROM_TIME TIMESTAMP; L_TO_TIME TIMESTAMP; L_MIN_ID DBA_HIST_SNAPSHOT.SNAP_ID%TYPE; L_MAX_ID DBA_HIST_SNAPSHOT.SNAP_ID%TYPE; L_START_NODE DBA_HIST_SNAPSHOT.INSTANCE_NUMBER%TYPE; L_END_NODE DBA_HIST_SNAPSHOT.INSTANCE_NUMBER%TYPE; L_DB_NAME V$DATABASE.NAME%TYPE; L_DB_ID V$DATABASE.DBID%TYPE; L_START_TIME DBA_HIST_SNAPSHOT.BEGIN_INTERVAL_TIME%TYPE; L_INTERVAL_MIN NUMBER := 0; L_INPUT_INTERVAL NUMBER := 0; L_COUNT NUMBER := 0; L_SNAP_DIFF NUMBER := 0; L_RPT_FORMAT VARCHAR2(10); L_START_SNAP_ID NUMBER; L_END_SNAP_ID NUMBER; L_TASK_NAME VARCHAR2(50); L_TASK_ID NUMBER; BEGIN BEGIN L_FROM_TIME := TO_TIMESTAMP ('&&1' ||lpad('&&2',4,0), 'YYYYMMDDHH24MI'); L_TO_TIME := TO_TIMESTAMP ('&&1' || lpad('&&3',4,0), 'YYYYMMDDHH24MI'); L_INPUT_INTERVAL := TO_NUMBER ('&&4'); L_RPT_FORMAT := UPPER('&&5'); IF L_RPT_FORMAT <> 'TEXT' THEN L_RPT_FORMAT := 'TEXT'; DBMS_OUTPUT.PUT_LINE('--Error Unknown Report Format - Both HTML and TEXT formatted reports will be generated'); END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE (SQLERRM); DBMS_OUTPUT.PUT_LINE('--Error input format: Date ('||'&&1'||') should in YYYYMMDD, From time (&&2) and to time (&&3) must be hour and minutes'); GOTO EXIT_LOOP; END; if (l_to_time<l_from_time) then DBMS_OUTPUT.PUT_LINE('--Error time range: From time '||to_char(l_from_time,'YYYYMMDD HH24MI')||' later than to time '||to_char(l_to_time,'YYYYMMDD HH24MI')); GOTO EXIT_LOOP; end if; SELECT DBID, NAME INTO L_DB_ID, L_DB_NAME FROM V$DATABASE; SELECT DISTINCT MIN (SNAP_ID) - 1, MAX (SNAP_ID), MIN (INSTANCE_NUMBER), MAX (INSTANCE_NUMBER), MIN (BEGIN_INTERVAL_TIME), ROUND(MIN(TO_DATE (TO_CHAR (END_INTERVAL_TIME, 'YYYYMMDDHH24MI'), 'YYYYMMDDHH24MI') - TO_DATE ( TO_CHAR (BEGIN_INTERVAL_TIME, 'YYYYMMDDHH24MI'), 'YYYYMMDDHH24MI' ))*1440 ) INTO L_MIN_ID, L_MAX_ID, L_START_NODE, L_END_NODE, L_START_TIME, L_INTERVAL_MIN FROM DBA_HIST_SNAPSHOT WHERE BEGIN_INTERVAL_TIME >= L_FROM_TIME AND END_INTERVAL_TIME <= L_TO_TIME; IF (L_INPUT_INTERVAL / L_INTERVAL_MIN < 1) THEN L_SNAP_DIFF := 1; L_INPUT_INTERVAL:=L_INTERVAL_MIN; ELSE L_SNAP_DIFF := ROUND (L_INPUT_INTERVAL / L_INTERVAL_MIN); END IF; DBMS_OUTPUT.PUT_LINE('set feedback off echo off serveroutput off wrap on pagesize 0 linesize 1000 trimspool on '); FOR X IN 1 .. (L_MAX_ID - L_MIN_ID) / L_SNAP_DIFF LOOP FOR Y IN L_START_NODE .. L_END_NODE LOOP L_START_SNAP_ID := L_MIN_ID + L_COUNT * L_SNAP_DIFF; L_END_SNAP_ID := L_MIN_ID + (L_COUNT + 1) * L_SNAP_DIFF; -- Create ADDM Reports dbms_advisor.create_task('ADDM',L_TASK_ID,L_TASK_NAME,'run_addm('||L_START_SNAP_ID||','|| L_END_SNAP_ID||''')'); dbms_advisor.set_task_parameter(L_TASK_NAME,'START_SNAPSHOT',L_START_SNAP_ID); dbms_advisor.set_task_parameter(L_TASK_NAME,'END_SNAPSHOT',L_END_SNAP_ID); dbms_advisor.set_task_parameter(L_TASK_NAME,'INSTANCE',Y); dbms_advisor.execute_task(L_TASK_NAME); dbms_output.put_line('--Task#' || L_TASK_ID || ' (' || L_TASK_NAME || ')'); -- text version ONLY DBMS_OUTPUT.PUT_LINE( 'spool c:\temp\online_60\' || L_DB_NAME || Y || '_&&1' || '_' || TO_CHAR ( L_START_TIME + L_COUNT * L_INPUT_INTERVAL / 1440, 'HH24MI' ) || '_to_' || TO_CHAR ( L_START_TIME + (L_COUNT + 1) * L_INPUT_INTERVAL / 1440, 'HH24MI' ) || '_ADDM.txt'); DBMS_OUTPUT.PUT_LINE('SET LONG 1000000'); DBMS_OUTPUT.PUT_LINE('SET PAGESIZE 50000'); DBMS_OUTPUT.PUT_LINE('COLUMN GET_CLOB FORMAT A80'); DBMS_OUTPUT.PUT_LINE('SELECT dbms_advisor.get_task_report(' || ''''||L_TASK_NAME||''',' || ''''||L_RPT_FORMAT||''',' || '''ALL'',' || '''ALL'',' || 'NULL' || ') as addm_rep from dba_advisor_tasks where task_id = '||L_TASK_ID||';' ); DBMS_OUTPUT.PUT_LINE ('spool off;'); L_TASK_NAME := NULL; END LOOP; L_COUNT := L_COUNT + 1; END LOOP; <<exit_loop>> NULL; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( '--NO DATA FOUND BETWEEN ' || TO_CHAR (L_FROM_TIME, 'YYYYMMDD HH24MI') || ' and ' || TO_CHAR (L_TO_TIME, 'YYYYMMDD HH24MI')); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( '--Error:'); DBMS_OUTPUT.PUT_LINE( SQLERRM); END; /
DECLARE task_name VARCHAR2(30) := 'DEMO_ADDM01'; task_desc VARCHAR2(30) := 'ADDM Feature Test'; task_id NUMBER; BEGIN dbms_advisor.create_task('ADDM', task_id, task_name, task_desc, null); dbms_advisor.set_task_parameter(task_name, 'START_SNAPSHOT', 65); dbms_advisor.set_task_parameter(task_name, 'END_SNAPSHOT', 66); dbms_advisor.set_task_parameter(task_name, 'INSTANCE', 1); dbms_advisor.set_task_parameter(task_name, 'DB_ID', 1712582900); dbms_advisor.execute_task(task_name); END; /