TEMPORARY TABLESPACE TEMP; ALTER USER TOAD QUOTA UNLIMITED ON SYSTEM; GRANT SELECT ANY DICTIONARY TO TOAD; GRANT CREATE SESSION TO TOAD; GRANT UNLIMITED TABLESPACE to TOAD; GRANT ALTER SESSION to TOAD; GRANT CREATE SYNONYM TO TOAD; GRANT CREATE ROLE TO TOAD; GRANT CREATE TRIGGER TO TOAD; GRANT CREATE TABLE TO TOAD; GRANT CREATE VIEW TO TOAD; GRANT CREATE PROCEDURE TO TOAD; GRANT DROP PUBLIC SYNONYM TO TOAD; GRANT CREATE PUBLIC SYNONYM TO TOAD; GRANT CREATE SEQUENCE TO TOAD; GRANT CREATE ANY TRIGGER TO TOAD;
DEFINE owner = 'TOAD'
DEFINE tablespace_info = 'TABLESPACE SYSTEM' DEFINE db = 'ORCL' PROMPT ========================================================================= === PROMPT Connecting as &&owner PROMPT ========================================================================= === CONNECT &&owner@&&db PROMPT ========================================================================= === PROMPT Creating profiler objects in &&owner schema PROMPT ========================================================================= === PROMPT Creating table PLSQL_PROFILER_RUNS CREATE TABLE &&owner..plsql_profiler_runs ( runid NUMBER PRIMARY KEY, -- unique run identifier, from plsql_pr ofiler_runnumber related_run NUMBER, -- runid of related run (for client-server correlat ion) run_owner VARCHAR2 (32), -- user that executed the procedure run_proc VARCHAR2 (256), -- procedure that was executed run_date DATE, -- start time of run run_comment VARCHAR2 (2047), -- user provided comment for this run run_total_time NUMBER, -- elapsed time for this run run_system_info VARCHAR2 (2047), -- currently unused run_comment1 VARCHAR2 (256), -- additional comment spare1 VARCHAR2 (256) -- unused ) &&tablespace_info; PROMPT Adding comment to PLSQL_PROFILER_RUNS COMMENT ON TABLE &&owner..plsql_profiler_runs IS 'Run-specific information for the PL/SQL profiler'; PROMPT Creating table PLSQL_PROFILER_UNITS CREATE TABLE &&owner..plsql_profiler_units ( runid NUMBER REFERENCES &&owner..plsql_profiler_runs ON DELETE CASCADE, unit_number NUMBER, -- internally generated library unit # unit_type VARCHAR2 (32), -- library unit type unit_owner VARCHAR2 (32), -- library unit owner name unit_name VARCHAR2 (32), -- library unit name unit_timestamp DATE, -- timestamp on library unit, can be used to detect ch anges to unit between runs total_time NUMBER DEFAULT 0 NOT NULL, spare1 NUMBER, -- unused spare2 NUMBER, -- unused PRIMARY KEY (runid, unit_number) ) &&tablespace_info; PROMPT Adding comment to PLSQL_PROFILER_UNITS COMMENT ON TABLE &&owner..plsql_profiler_units IS 'Information about each library unit in a run'; PROMPT Creating table PLSQL_PROFILER_DATA CREATE TABLE &&owner..plsql_profiler_data ( runid NUMBER, -- unique (generated) run identifier unit_number NUMBER, -- internally generated library unit # line# NUMBER NOT NULL, -- line number in unit text VARCHAR2 (4000), -- source for the line total_occur NUMBER, -- number of times line was executed total_time NUMBER, -- total time spent executing line min_time NUMBER, -- minimum execution time for this line max_time NUMBER, -- maximum execution time for this line spare1 NUMBER, -- unused spare2 NUMBER, -- unused spare3 NUMBER, -- unused spare4 NUMBER, -- unused PRIMARY KEY (runid, unit_number, line#), FOREIGN KEY (runid, unit_number) REFERENCES &&owner..plsql_profiler_units ON DELETE CASCADE ) &&tablespace_info; PROMPT Adding comment to PLSQL_PROFILER_DATA COMMENT ON TABLE &&owner..plsql_profiler_data IS 'Accumulated data from all profiler runs'; PROMPT Creating sequence PLSQL_PROFILER_RUNNUMBER CREATE SEQUENCE &&owner..plsql_profiler_runnumber START WITH 1 NOCACHE; PROMPT Creating package spec TOAD_PROFILER DEFINE owner = 'TOAD' DEFINE all_triggers = 'DBA_TRIGGERS' DEFINE all_source = 'DBA_SOURCE' CREATE OR REPLACE PACKAGE &&owner..toad_profiler IS PROCEDURE rollup_unit (run_number IN NUMBER, UnitNumber IN NUMBER, UnitType IN VARCHAR2, UnitOwner IN VARCHAR2, UnitName IN VARCHAR2); PROCEDURE rollup_run (run_number IN NUMBER); PROCEDURE rollup_all_runs; END toad_profiler; / PROMPT Creating package body TOAD_PROFILER CREATE OR REPLACE PACKAGE BODY &&owner..toad_profiler IS -- compute the total time spent executing this unit - the sum of the -- time spent executing lines in this unit (for this run) PROCEDURE rollup_unit (run_number IN NUMBER, UnitNumber IN NUMBER, UnitType IN VARCHAR2, UnitOwner IN VARCHAR2, UnitName IN VARCHAR2) IS TYPE TSourceTable IS TABLE OF VARCHAR2 (4000) INDEX BY BINARY_INTEGER; SourceTable TSourceTable; TriggerBody LONG; FoundTriggerSource BOOLEAN; Cnt NUMBER; LnStart NUMBER; LnEnd NUMBER; Pos NUMBER; vText VARCHAR2 (4000); IsWrapped BOOLEAN; TotalTime NUMBER; -- Select the lines for the unit to find source code CURSOR cLines (run_number NUMBER, UnitNumber NUMBER) IS SELECT line# FROM plsql_profiler_data WHERE runid = run_number AND unit_number = UnitNumber; BEGIN SELECT SUM (total_time) INTO TotalTime FROM plsql_profiler_data WHERE runid = run_number AND unit_number = UnitNumber; IF TotalTime IS NULL THEN TotalTime := 0; END IF; UPDATE plsql_profiler_units SET total_time = TotalTime WHERE runid = run_number AND unit_number = UnitNumber; -- Get trigger source into index-by table IF UnitType = 'TRIGGER' THEN BEGIN FoundTriggerSource := TRUE; SELECT trigger_body INTO TriggerBody FROM SYS.&&all_triggers WHERE owner = UnitOwner AND trigger_name = UnitName; EXCEPTION WHEN NO_DATA_FOUND THEN FoundTriggerSource := FALSE; END; IF FoundTriggerSource THEN Cnt := 1; LnStart := 1; LOOP LnEnd := INSTR (TriggerBody, CHR (10), 1, Cnt); IF (LnEnd = 0) THEN SourceTable (Cnt) := SUBSTR (TriggerBody, LnStart); ELSE SourceTable (Cnt) := SUBSTR (TriggerBody, LnStart, (LnEnd - LnStart)); END IF; LnStart := LnStart + (LnEnd - LnStart) + 1; Cnt := Cnt + 1; EXIT WHEN (lnEnd = 0); END LOOP; END IF; -- see if the code is wrapped ELSE BEGIN SELECT UPPER (text) INTO vtext FROM SYS.&&all_source s WHERE s.TYPE = UnitType AND s.owner = UnitOwner AND s.name = UnitName AND s.line = 1; IsWrapped := (INSTR (vText, ' WRAPPED') > 0); EXCEPTION WHEN NO_DATA_FOUND THEN IsWrapped := FALSE; END; END IF; -- Get the source for each line in unit Cnt := 1; FOR linerec IN cLines (run_number, UnitNumber) LOOP IF UnitType = 'TRIGGER' THEN IF FoundTriggerSource THEN vText := SourceTable (linerec.line#); ELSE IF Cnt = 1 THEN vText := '<source unavailable>'; ELSE vText := NULL; END IF; END IF; ELSE IF IsWrapped THEN IF Cnt = 1 THEN vText := '<wrapped>'; ELSE vText := NULL; END IF; ELSE BEGIN SELECT text INTO vtext FROM SYS.&&all_source s WHERE s.TYPE = UnitType AND s.owner = UnitOwner AND s.name = UnitName AND s.line = linerec.line#; EXCEPTION WHEN NO_DATA_FOUND THEN vText := NULL; END; END IF; END IF; -- store the source line UPDATE plsql_profiler_data d SET d.text = vText WHERE d.runid = run_number AND d.unit_number = UnitNumber AND d.line# = linerec.line#; Cnt := Cnt + 1; END LOOP; END rollup_unit; -- rollup all units for the given run PROCEDURE rollup_run (run_number IN NUMBER) IS tabpos NUMBER; comment VARCHAR2 (2047); proc VARCHAR2 (256); -- -- only select those units which have not been rolled up yet CURSOR cunits (run_number NUMBER) IS SELECT unit_number, unit_type, unit_owner, unit_name FROM plsql_profiler_units WHERE runid = run_number AND total_time = 0 ORDER BY unit_number ASC; BEGIN -- Fix Oracle's calling a 'PACKAGE' a 'PACKAGE SPEC' UPDATE plsql_profiler_units SET unit_type = 'PACKAGE' WHERE runid = run_number AND unit_type LIKE 'PACKAGE SPEC%'; -- parse the RUN_COMMENT column to get the procedure name -- (note: this replaces the BI_PLSQL_PROFILER_RUNS trigger. SELECT run_proc, run_comment INTO proc, comment FROM plsql_profiler_runs WHERE runid = run_number; IF proc IS NULL THEN tabpos := INSTR (comment, CHR (8)); IF tabpos > 0 THEN proc := SUBSTR (comment, tabpos + 1); comment := SUBSTR (comment, 1, tabpos - 1); ELSE proc := 'ANONYMOUS BLOCK'; END IF; UPDATE plsql_profiler_runs SET run_owner = USER, run_proc = proc, run_comment = comment WHERE runid = run_number; END IF; FOR unitrec IN cunits (run_number) LOOP rollup_unit (run_number, unitrec.unit_number, unitrec.unit_type, unitrec.unit_owner, unitrec.unit_name); END LOOP; END rollup_run; -- rollup all runs PROCEDURE rollup_all_runs IS CURSOR crunid IS SELECT runid FROM plsql_profiler_runs ORDER BY runid ASC; BEGIN FOR runidrec IN crunid LOOP rollup_run (runidrec.runid); END LOOP crunid; COMMIT; END rollup_all_runs; END toad_profiler; / PROMPT Creating public synonym TOAD_PROFILER CREATE OR REPLACE PUBLIC SYNONYM TOAD_PROFILER FOR &&owner..TOAD_PROFILER; PROMPT Granting EXECUTE on TOAD_PROFILER to PUBLIC GRANT EXECUTE ON &&owner..TOAD_PROFILER TO PUBLIC; DEFINE table1 = 'plsql_profiler_data' DEFINE table2 = 'plsql_profiler_runs' DEFINE table3 = 'plsql_profiler_units' DEFINE seq1 = 'plsql_profiler_runnumber' PROMPT ========================================================================= === PROMPT Adding public synonyms for Profiler objects PROMPT ========================================================================= === PROMPT Creating public synonym &&table1 CREATE OR REPLACE PUBLIC SYNONYM &&table1 FOR &&owner..&&table1; PROMPT Creating public synonym &&table2 CREATE OR REPLACE PUBLIC SYNONYM &&table2 FOR &&owner..&&table2; PROMPT Creating public synonym &&table3 CREATE OR REPLACE PUBLIC SYNONYM &&table3 FOR &&owner..&&table3; PROMPT Creating public synonym &&seq1 CREATE OR REPLACE PUBLIC SYNONYM &&seq1 FOR &&owner..&&seq1; PROMPT ========================================================================= === PROMPT Granting privileges to PUBLIC on Profiler objects PROMPT ========================================================================= === PROMPT Granting SELECT, INSERT, UPDATE, DELETE on &&table1 to PUBLIC GRANT SELECT, INSERT, UPDATE, DELETE ON &&owner..&&table1 TO PUBLIC; PROMPT Granting SELECT, INSERT, UPDATE, DELETE on &&table2 to PUBLIC GRANT SELECT, INSERT, UPDATE, DELETE ON &&owner..&&table2 TO PUBLIC; PROMPT Granting SELECT, INSERT, UPDATE, DELETE on &&table3 to PUBLIC GRANT SELECT, INSERT, UPDATE, DELETE ON &&owner..&&table3 TO PUBLIC; PROMPT Granting SELECT on &&seq1 to PUBLIC GRANT SELECT ON &&owner..&&seq1 TO PUBLIC;