Vous êtes sur la page 1sur 7

CREATE USER TOAD IDENTIFIED BY wwe

DEFAULT TABLESPACE SYSTEM


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;

Vous aimerez peut-être aussi