The original question on this thread was for an automated "purge" for
STATSPACK.  I wrote this stored procedure based on the v8.1.7 version of the
standard "sppurge.sql" script.  I'd use that script, except I don't like the
way it is called (i.e. range of SNAP_IDs).  This stored procedure figures
out the range of SNAP_IDs based on the parameter indicating the number of
days of data to retain...

Hope this helps -- as always, no warranties!

----------------------- begin included SQL*Plus
script ------------------------------
/**********************************************************************
 * File: sppurpkg.sql
 * Type: SQL*Plus script
 * Author: Tim Gorman (Evergreen Database Technologies, Inc.)
 * Date: 18Oct01
 *
 * Description:
 * SQL*Plus script containing DDL commands to create the package
 * SPPURPKG, intended for use with STATSPACK from Oracle database
 * versions 8.1.7 and above.  Adapted from the "sppurge.sql" script
 * which is included with standard STATSPACK v8.1.7, it is easier
 * to use because it can be called automatedly from the DBMS_JOB
 * package (instead of interactively as with "sppurge.sql") and it
 * takes only the number of days of STATSPACK data to retain
 * (instead of prompting for a begin/end range of SNAP_IDs, like
 * "sppurge.sql")
 *
 * After the package is created, then this script will submit the
 * procedure "SPPURPKG.RUN(14)" (i.e. purge data older than 14
 * days) to run once per day.  You may want to modify this,
 * depending on the volume of activity on the database(s) being
 * monitored by STATSPACK and the amount of storage you are
 * prepared to allocate to the PERFSTAT schema...
 *
 * Modifications:
 *********************************************************************/
set echo on feedback on timing on verify on

spool sppurpkg

connect perfstat

show user
show release

set termout off
create or replace package SPPURPKG
is
 --
 procedure PURGE(in_days_older_than IN INTEGER);
 --
end SPPURPKG;
/
set termout on
show errors

set termout off
create or replace package body SPPURPKG
is
 --
 procedure PURGE(in_days_older_than IN INTEGER)
 is
  --
  cursor get_snaps(in_days IN INTEGER)
  is
  select s.rowid,
   s.snap_id,
   s.dbid,
   s.instance_number
  from stats$snapshot s,
   sys.v_$database d,
   sys.v_$instance i
  where s.dbid = d.dbid
  and s.instance_number = i.instance_number
  and s.snap_time < trunc(sysdate) - in_days;
  --
  errcontext  VARCHAR2(100);
  errmsg   VARCHAR2(1000);
  save_module  VARCHAR2(48);
  save_action  VARCHAR2(32);
  --
 begin
  --
  errcontext := 'save settings of DBMS_APPLICATION_INFO';
  dbms_application_info.read_module(save_module, save_action);
  dbms_application_info.set_module('SPPURPKG.PURGE', 'begin');
  --
  errcontext := 'open/fetch get_snaps';
  dbms_application_info.set_action(errcontext);
  for x in get_snaps(in_days_older_than) loop
   --
   errcontext := 'delete (cascade) STATS$SNAPSHOT';
   dbms_application_info.set_action(errcontext);
   delete
   from stats$snapshot
   where rowid = x.rowid;
   --
   errcontext := 'delete "dangling" STATS$SQLTEXT rows';
   dbms_application_info.set_action(errcontext);
   delete
   from stats$sqltext
   where (hash_value, text_subset) not in
    (select /*+ hash_aj(ss) */ hash_value, text_subset
     from stats$sql_summary ss
    );
   --
   errcontext := 'delete "dangling" STATS$DATABASE_INSTANCE rows';
   dbms_application_info.set_action(errcontext);
   delete
   from stats$database_instance i
   where i.instance_number = x.instance_number
   and i.dbid            = x.dbid
   and not exists
    (select 1
     from stats$snapshot s
     where s.dbid            = i.dbid
     and s.instance_number = i.instance_number
     and s.startup_time    = i.startup_time
    );
   --
   errcontext := 'delete "dangling" STATS$STATSPACK_PARAMETER rows';
   dbms_application_info.set_action(errcontext);
   delete
   from stats$statspack_parameter p
   where p.instance_number = x.instance_number
   and p.dbid            = x.dbid
   and not exists
    (select 1
     from stats$snapshot s
     where s.dbid            = p.dbid
     and s.instance_number = p.instance_number
    );
   --
   errcontext := 'fetch/close get_snaps';
   dbms_application_info.set_action(errcontext);
   --
  end loop;
  --
  errcontext := 'restore saved settings of DBMS_APPLICATION_INFO';
  dbms_application_info.set_module(save_module, save_action);
  --
 exception
  --
  when OTHERS then
   errmsg := sqlerrm;
   dbms_application_info.set_module(save_module, save_action);
   raise_application_error(-20000, errcontext || ': ' || errmsg);
  --
 end PURGE;
 --
end SPPURPKG;
/
set termout on
show errors

variable jobno number;
begin
  dbms_job.submit(:jobno, 'sppurpkg.purge(14);', sysdate+(1/1440),
'SYSDATE+1', TRUE);
  commit;
end;
/

set pages 100
select * from user_jobs where job = :jobno;

spool off
----------------------- end included SQL*Plus
script ------------------------------

----- Original Message -----
To: "Multiple recipients of list ORACLE-L" <[EMAIL PROTECTED]>
Sent: Wednesday, August 07, 2002 4:16 PM


> > Hey Jared,
> > Did you do anything with statspack or the wait interface in your
> > toolset/book? Gotta get a copy for inspiration.
>
> No, no wait interface stuff, at least, I don't remember any.
>
> You're correct about writing code for others to see.  It's one
> thing to write code for internal use, but just try packaging
> it and writing coherent documentation.  The amount of effort
> shoots *wayyyy* up.
>
> I have ideas for new iterations of the toolkit that is
> included in the book, but I'll wait and see what others
> like and dislike, and what they think is missing.
>
> Probably a lot. Can't really pack too much into a couple
> hundred pages.
>
> Jared
>
> --
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> --
> Author:
>   INET: [EMAIL PROTECTED]
>
> Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> San Diego, California        -- Public Internet access / Mailing Lists
> --------------------------------------------------------------------
> To REMOVE yourself from this mailing list, send an E-Mail message
> to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
> the message BODY, include a line containing: UNSUB ORACLE-L
> (or the name of mailing list you want to be removed from).  You may
> also send the HELP command for other information (like subscribing).

-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Tim Gorman
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to