MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/rdbms/admin/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/rdbms/admin/awrgdinp.sql

Rem
Rem $Header: rdbms/admin/awrgdinp.sql /main/7 2017/07/28 16:56:56 yingzhen Exp $
Rem
Rem awrgdinp.sql
Rem
Rem Copyright (c) 2007, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      awrgdinp.sql - AWR Glopal Compare Period Report Input variables
Rem
Rem    DESCRIPTION
Rem      This script gets the dbid,eid,filename,etc from the user
Rem
Rem    NOTES
Rem
Rem    BEGIN SQL_FILE_METADATA
Rem    SQL_SOURCE_FILE: rdbms/admin/awrgdinp.sql
Rem    SQL_SHIPPED_FILE: rdbms/admin/awrgdinp.sql
Rem    SQL_PHASE: UTILITY
Rem    SQL_STARTUP_MODE: NORMAL
Rem    SQL_IGNORABLE_ERRORS: NONE
Rem    END SQL_FILE_METADATA
Rem    
Rem    MODIFIED   (MM/DD/YY)
Rem    yingzhen    07/20/17 - Bug 26448963 check report_name extension
Rem    kmorfoni    01/03/17 - Bug 24673313: Fix typo
Rem    arbalakr    09/08/16 - Bug 24625721: Use view_loc variable correctly
Rem    arbalakr    07/19/16 - Use the awr_* views instead of dba_hist* views
Rem    yingzhen    05/25/16 - Bug 22604990, sort inst info of AWR report
Rem    osuro       06/20/14 - Bug 18997912 - Incorrect instance range for DB2
Rem    ilistvin    12/17/07 - Created
Rem


-- Script Parameters:
--   First Param (&1) : file prefix e.g. 'awrrpt_'
--   Second Param (&2) : file extension e.g. '.html', '.lst'
--     **** IMPORTANT - the second parameter must be non-null, or else SQL*Plus
--          adds an awkward prompt when we try to use it

-- After executing, this module leaves the substitution variable
-- &report_name defined.  Issue the command spool &report_name to
-- spool your report to a file, and then undefine report_name when you're
-- done with it.

-- The following list of SQL*Plus bind variables will be defined and assigned
--  a value by this SQL*Plus script:
-- First pair of snapshots
--    variable dbid      number   - Database id
--    variable instl     varchar2 - CSV list of instance numbers
--    variable bid       number   - Begin snapshot id 
--    variable eid       number   - End snapshot id
-- Second pair of snapshots
--    variable dbid2     number   - Database id 
--    variable instl2    varchar2 - CSV list of instance numbers
--    variable bid2      number   - Begin snapshot id
--    variable eid2      number   - End snapshot id




clear break compute;
repfooter off;
ttitle off;
btitle off;

set heading on;
set timing off veri off space 1 flush on pause off termout on numwidth 10;
set echo off feedback off pagesize 60 linesize 80 newpage 1 recsep off;
set trimspool on trimout on define "&" concat "." serveroutput on;
set underline on;

--
-- Request the DB Id and Instance Number, if they are not specified

column instt_num  heading "Inst Num"  format 99999;
column instt_name heading "Instance"  format a12;
column dbb_name   heading "DB Name"   format a12;
column dbbid      heading "DB Id"     format a12 just c;
column host       heading "Host"      format a12;

Rem
Rem Check if we are inside a PDB. If so, choose the AWR 
Rem ===================================================
column view_loc_def new_value view_loc_def noprint;
select '' view_loc_def from dual where rownum = 0;

column script_viewloc new_value script_viewloc noprint;
select case when '&view_loc_def' IS NULL
            then '@getawrviewloc'
            else '@ashrptinoop' end as script_viewloc
from dual;
@&script_viewloc

set serveroutput on format wrapped;

prompt
prompt
prompt Instances in this Workload Repository schema
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DECLARE
  dynsql     VARCHAR2(2048);
  cur        sys_refcursor;
  TYPE cur_row_type IS RECORD
  (
    dbbid        VARCHAR2(32),
    instt_num    AWR_PDB_DATABASE_INSTANCE.instance_number%type,
    dbb_name     AWR_PDB_DATABASE_INSTANCE.db_name%type,
    instt_name   AWR_PDB_DATABASE_INSTANCE.instance_name%type,
    host         AWR_PDB_DATABASE_INSTANCE.host_name%type
  );
  
  curi        cur_row_type;
  printhead   NUMBER;
BEGIN
  printhead := 1;
  dynsql :=
    'select distinct
            (case when cd.dbid = wr.dbid and 
                       cd.name = wr.db_name and
                       ci.instance_number = wr.instance_number and
                       ci.instance_name   = wr.instance_name
                  then ''* ''
                  else ''  ''
             end) || wr.dbid   dbbid
           , wr.instance_number instt_num
           , wr.db_name         dbb_name
           , wr.instance_name   instt_name
           , wr.host_name       host
     from ' || '&view_loc' || '_database_instance wr,
           v$database cd, v$instance ci
     order by dbbid, instt_num';
  open cur for dynsql;

  LOOP

    fetch cur into curi;
    exit when cur%notfound;
    
    if (printhead <> 0) then
      dbms_output.put_line(rpad('  DB Id  ' , 12) || ' ' ||
                           rpad('Inst Num', 10) || ' ' ||
                           rpad('DB Name', 12) || ' ' ||
                           rpad('Instance', 12) || ' ' ||
                           rpad('Host', 12));
      dbms_output.put_line(rpad('------------',12) || ' ' ||
                           rpad('----------', 10) || ' ' ||
                           rpad('---------', 12) || ' ' ||
                           rpad('----------', 12) || ' ' ||
                           rpad('------', 12));
      printhead := 0;
    end if;
    dbms_output.put_line(rpad(curi.dbbid,12) || ' ' ||
                         rpad(to_char(curi.instt_num,'9999'), 10) || ' ' ||
                         rpad(curi.dbb_name,12) || ' ' ||
                         rpad(curi.instt_name,12) || ' ' ||
                         rpad(curi.host,12));

  END LOOP; 
  close cur;
END;
/
prompt
prompt Database Id and Instance Number for the First Pair of Snapshots
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt Using &&dbid for Database Id for the first pair of snapshots
prompt Using instances &&instance_numbers_or_ALL for the first pair of snapshots

--
--  Set up the binds for dbid and instance number list
--
variable dbid       number;
variable instl      varchar2(1023);
variable inst_num   varchar2(3);
begin
  :dbid      :=  &dbid;
  :instl     :=  '&instance_numbers_or_ALL';
  if UPPER(:instl) = 'ALL' then
    :instl := '';
  end if;
  :inst_num  := '1st';
end;
/


--
--  Error reporting
--
whenever sqlerror exit;
variable max_snap_time char(10);
declare
  csnapid_str    varchar2(2048);
  csnapid_cur    sys_refcursor;
begin
  csnapid_str := 
    'select to_char(max(end_interval_time),''dd/mm/yyyy'')
     from  ' || '&view_loc' || '_snapshot
     where dbid            = :dbid';

  -- Check Snapshots exist for Database Id/Instance Number
  open csnapid_cur for csnapid_str using :dbid;
  fetch csnapid_cur into :max_snap_time;
  if csnapid_cur%notfound then
    raise_application_error(-20200,
      'No snapshots exist for database '||:dbid);
  end if;
  close csnapid_cur;
end;
/
whenever sqlerror continue;


--
--  Ask how many days of snapshots to display

set termout on;
column instart_fmt noprint;
column db_name     format a12  heading 'DB Name';
column snap_id     format 99999990 heading 'Snap Id';
column snapdat     format a18  heading 'Snap Started' just c;
column lvl         format 99   heading 'Snap|Level';

prompt
prompt
prompt Specify the number of days of snapshots to choose from
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt Entering the number of days (n) will result in the most recent
prompt (n) days of snapshots being listed.  Pressing <return> without
prompt specifying a number lists all completed snapshots.
prompt
prompt

set heading off;
column num_days new_value num_days noprint;
select    'Listing '
       || decode( nvl('&&num_days', 3.14)
                , 0    , 'no snapshots'
                , 3.14 , 'all Completed Snapshots'
                , 1    , 'the last day''s Completed Snapshots'
                , 'the last &num_days days of Completed Snapshots')
     , nvl('&&num_days', 3.14)  num_days
  from sys.dual;
set heading on;


--
-- List available snapshots

break on inst_name on db_name on host on instart_fmt skip 1;

ttitle off;
set serveroutput on format wrapped;

DECLARE
  dynsql    VARCHAR2(2048);
  cur       sys_refcursor;
  TYPE cur_row_type IS RECORD
  (
    db_name       AWR_PDB_DATABASE_INSTANCE.db_name%type,
    snap_id       AWR_PDB_SNAPSHOT.snap_id%type,
    snapdat       VARCHAR2(32),
    lvl           AWR_PDB_SNAPSHOT.snap_level%type
  );
  
  prev_dbname   varchar2(32);
  rowcount number;
  curi cur_row_type;
  printhead number;
BEGIN
  rowcount := 0;
  printhead := 1;
  prev_dbname := '' ;
  
  dynsql := 
    'select  di.db_name                                        db_name
           , s.snap_id                                         snap_id
           , to_char(max(s.end_interval_time),''dd Mon YYYY HH24:mi'') snapdat
           , max(s.snap_level)                                      lvl
     from ' || '&view_loc' || '_snapshot s,
          ' || '&view_loc' || '_database_instance di
     where di.dbid             = :dbid
      and di.dbid             = s.dbid
      and di.instance_number  = s.instance_number
      and di.startup_time     = s.startup_time
      and s.end_interval_time >=
                     decode( &num_days
                        , 0   , to_date(''31-JAN-9999'',''DD-MON-YYYY'')
                        , 3.14, s.end_interval_time
                        , to_date(:max_snap_time,''dd/mm/yyyy'') - (&num_days-1))
     group by db_name, snap_id
     order by db_name, snap_id';
 
  OPEN cur FOR dynsql USING :dbid, :max_snap_time;
  LOOP
      FETCH cur INTO curi;
    EXIT when cur%NOTFOUND;
    if (printhead = 1 OR rowcount > 55 ) then
      dbms_output.put_line(rpad('DB Name', 12) || ' ' ||
                           rpad('Snap Id', 10) || ' ' ||
                           rpad('   Snap Started   ', 18) || ' ' ||
                           rpad('Snap Level', 10));
      dbms_output.put_line(rpad('------------', 12) || ' ' ||
                           rpad('----------', 10) || ' ' ||
                           rpad('------------------', 18) || ' ' ||
                           rpad('----------', 10));
      printhead := 0;
      rowcount := 0;
    end if;
    IF (rowcount = 0 OR 
        prev_dbname <> curi.db_name ) THEN
      dbms_output.put_line(' ');
      dbms_output.put_line(rpad(curi.db_name,12) || ' ' ||
                           rpad(to_char(curi.snap_id,99999990),10) || ' ' ||
                           rpad(curi.snapdat,18) || ' ' ||
                           rpad(to_char(curi.lvl,99),10));
    ELSE
      dbms_output.put_line(rpad(' ',12) || ' ' ||
                           rpad(to_char(curi.snap_id,99999990),10) || ' ' ||
                           rpad(curi.snapdat,18) || ' ' ||
                           rpad(to_char(curi.lvl,99),10));
    END IF;
    prev_dbname := curi.db_name;
    rowcount := rowcount + 1;
  END LOOP;
  close cur;
END;
/
clear break;
ttitle off;


--
--  Ask for the snapshots Id's which are to be compared

prompt
prompt
prompt Specify the First Pair of Begin and End Snapshot Ids
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt First Begin Snapshot Id specified: &&begin_snap
prompt
prompt First End   Snapshot Id specified: &&end_snap
prompt


--
--  Set up the snapshot-related binds

variable bid        number;
variable eid        number;
begin
  :bid       :=  &begin_snap;
  :eid       :=  &end_snap;
end;
/

prompt


--
--  Error reporting

whenever sqlerror exit;
declare
  cspid_str VARCHAR2(1024);
  cspid_cur sys_refcursor;
 
  bsnapt  awr_pdb_snapshot.end_interval_time%type;
  bstart  awr_pdb_snapshot.startup_time%type;
  esnapt  awr_pdb_snapshot.end_interval_time%type;
  estart  awr_pdb_snapshot.startup_time%type;
  insts   AWRRPT_INSTANCE_LIST_TYPE;

begin  
  
  cspid_str :=
    'select end_interval_time
          , startup_time
     from ' || '&view_loc' || '_snapshot
     where snap_id         = :snapid
      and dbid            = :dbid';


  -- Check Begin Snapshot id is valid, get corresponding instance startup time
  open cspid_cur for cspid_str using :bid, :dbid;
  fetch cspid_cur into bsnapt, bstart;
  if cspid_cur%notfound then
    raise_application_error(-20200,
      'Begin Snapshot Id '||:bid||' does not exist for this database');
  end if;
  close cspid_cur;

  -- Check End Snapshot id is valid and get corresponding instance startup time
  open cspid_cur for cspid_str using :eid, :dbid;
  fetch cspid_cur into esnapt, estart;
  if cspid_cur%notfound then
    raise_application_error(-20200,
      'End Snapshot Id '||:eid||' does not exist for this database');
  end if;
  if :eid <= :bid then
    raise_application_error(-20200,
     'End Snapshot Id '||:eid||
     ' must be greater than Begin Snapshot Id '||:bid);
  end if;
  close cspid_cur;

 --
 -- Make sure at least one instance has not been re-started between
 -- begin and end snapshots
 --
 declare
   dynsql varchar2(1024);
 begin
   dynsql := 
     'select b.instance_number
      from ' || '&view_loc' || '_snapshot b, ' || '&view_loc' || '_snapshot e
      where b.dbid = :dbid
        and b.snap_id = :bid
        and e.dbid = :dbid
        and e.snap_id = :eid
        and e.startup_time = b.startup_time
        and e.instance_number = b.instance_number';

    execute immediate dynsql 
    bulk collect into insts
    using :dbid, :bid, :dbid, :eid;
 exception
  -- Check startup time is same for begin and end snapshot ids
  when no_data_found then
    raise_application_error(-20200,
      'All instances were shutdown between snapshots '||:bid||' and '||:eid);
  when others then raise;
 end;

end;
/
whenever sqlerror continue;



clear break compute;
repfooter off;
ttitle off;
btitle off;

set heading on;
set timing off veri off space 1 flush on pause off termout on numwidth 10;
set echo off feedback off pagesize 60 linesize 80 newpage 1 recsep off;
set trimspool on trimout on define "&" concat "." serveroutput on;
set underline on;

--
-- Request the DB Id and Instance Number, if they are not specified
set serveroutput on format wrapped;

prompt
prompt
prompt Instances in this Workload Repository schema
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DECLARE
  dynsql   VARCHAR2(2048);
  cur         sys_refcursor;

  TYPE cur_row_type IS RECORD
  (
    dbbid       VARCHAR2(32),
    instt_num   AWR_PDB_DATABASE_INSTANCE.instance_number%type,
    dbb_name    AWR_PDB_DATABASE_INSTANCE.db_name%type,
    instt_name  AWR_PDB_DATABASE_INSTANCE.instance_name%type,
    host        AWR_PDB_DATABASE_INSTANCE.host_name%type
  );

  curi        cur_row_type;
  printhead   NUMBER;

BEGIN

  printhead := 1;
  dynsql := 
    'select distinct
           (case when cd.dbid = wr.dbid and 
                      cd.name = wr.db_name and
                      ci.instance_number = wr.instance_number and
                      ci.instance_name   = wr.instance_name
                 then ''* ''
                 else ''  ''
            end) || wr.dbid   dbbid
          , wr.instance_number instt_num
          , wr.db_name         dbb_name
          , wr.instance_name   instt_name
          , wr.host_name       host
     from ' || '&view_loc' || '_database_instance wr, 
           (select sys_context(''userenv'',''dbid'') dbid,
                   sys_context(''userenv'',''db_name'') name
            from dual) cd, v$instance ci
     order by dbbid, instt_num';
  
  open cur for dynsql;

  LOOP
    fetch cur into curi;
    exit when cur%notfound;
    
    if (printhead = 1) then
     dbms_output.put_line(rpad('  DB Id  ' , 12) || ' ' ||
                           rpad('Inst Num', 10) || ' ' ||
                           rpad('DB Name', 12) || ' ' ||
                           rpad('Instance', 12) || ' ' ||
                           rpad('Host', 12));
      dbms_output.put_line(rpad('------------',12) || ' ' ||
                           rpad('----------', 10) || ' ' ||
                           rpad('---------', 12) || ' ' ||
                           rpad('----------', 12) || ' ' ||
                           rpad('------', 12));
      printhead := 0;
    end if;
    dbms_output.put_line(rpad(curi.dbbid,12) || ' ' ||
                         rpad(to_char(curi.instt_num,'9999'), 10) || ' ' ||
                         rpad(curi.dbb_name,12) || ' ' ||
                         rpad(curi.instt_name,12) || ' ' ||
                         rpad(curi.host,12));
  END LOOP;
  close cur;
END;
/
--
-- Set up dbid and instance number for the first pair of snapshots
-- as defaults for the second pair of snapshots
--
column dbid1 new_value dbid1 noprint;
column instl1 new_value instnum1 noprint;
select :dbid as dbid1, :instl as instnum1 from dual;

prompt
prompt Database Id and Instance Number for the Second Pair of Snapshots
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt Using &&dbid2 for Database Id for the second pair of snapshots
prompt Using instances &&instance_numbers_or_ALL2 for the second pair of snapshots

--
--  Set up the binds for dbid and instance number list
--
variable dbid2      number;
variable instl2     varchar2(1023);
variable inst_num2  varchar2(4);
begin
  :dbid2     :=  nvl(&dbid2,&dbid1);
  :instl2    :=  '&instance_numbers_or_ALL2';
  if UPPER(:instl2) = 'ALL' or UPPER(:instl2) = 'ALL2' then
    :instl2:= '';
  end if;
  :inst_num2 := '2nd';
end;
/


--
--  Error reporting
--
whenever sqlerror exit;
variable max_snap_time char(10);
declare

  csnapid_str   VARCHAR2(1024);
  csnapid_cur   SYS_REFCURSOR;

begin

  csnapid_str := 
    'select to_char(max(end_interval_time),''dd/mm/yyyy'')
     from ' || '&view_loc' || '_snapshot
     where dbid            = :dbid2';

  -- Check Snapshots exist for Database Id/Instance Number
  open csnapid_cur for csnapid_str using :dbid2;
  fetch csnapid_cur into :max_snap_time;
  if csnapid_cur%notfound then
    raise_application_error(-20200,
      'No snapshots exist for database '||:dbid2);
  end if;
  close csnapid_cur;
end;
/
whenever sqlerror continue;


--
--  Ask how many days of snapshots to display

set termout on;
column instart_fmt noprint;
column db_name     format a12  heading 'DB Name';
column snap_id     format 99999990 heading 'Snap Id';
column snapdat     format a18  heading 'Snap Started' just c;
column lvl         format 99   heading 'Snap|Level';

prompt
prompt
prompt Specify the number of days of snapshots to choose from
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt Entering the number of days (n) will result in the most recent
prompt (n) days of snapshots being listed.  Pressing <return> without
prompt specifying a number lists all completed snapshots.
prompt
prompt

set heading off;
column num_days2 new_value num_days2 noprint;
select    'Listing '
       || decode( nvl('&&num_days2', 3.14)
                , 0    , 'no snapshots'
                , 3.14 , 'all Completed Snapshots'
                , 1    , 'the last day''s Completed Snapshots'
                , 'the last &num_days days of Completed Snapshots')
     , nvl('&&num_days', 3.14)  num_days2
  from sys.dual;
set heading on;


--
-- List available snapshots

break on inst_name on db_name on host on instart_fmt skip 1;

ttitle off;
set serveroutput on format wrapped;

DECLARE
  dynsql    VARCHAR2(2048);
  cur       sys_refcursor;
  TYPE cur_row_type IS RECORD
  (
    db_name       AWR_PDB_DATABASE_INSTANCE.db_name%type,
    snap_id       AWR_PDB_SNAPSHOT.snap_id%type,
    snapdat       VARCHAR2(32),
    lvl           AWR_PDB_SNAPSHOT.snap_level%type
  );
  
  prev_dbname   varchar2(32);
  rowcount number;
  curi cur_row_type;
  printhead number;
BEGIN
  rowcount := 0;
  printhead := 1;
  prev_dbname := '' ;

  dynsql := 
    'select  di.db_name                                        db_name
           , s.snap_id                                         snap_id
           , to_char(max(s.end_interval_time),''dd Mon YYYY HH24:mi'') snapdat
           , max(s.snap_level)                                      lvl
     from ' || '&view_loc' || '_snapshot s, 
          ' || '&view_loc' || '_database_instance di
     where di.dbid             = :dbid2
       and di.dbid             = s.dbid
       and di.instance_number  = s.instance_number
       and di.startup_time     = s.startup_time
       and s.end_interval_time >= 
                  decode( &num_days
                        , 0   , to_date(''31-JAN-9999'',''DD-MON-YYYY'')
                        , 3.14, s.end_interval_time
                        , to_date(:max_snap_time,''dd/mm/yyyy'') - (&num_days-1))
     group by db_name, snap_id
     order by db_name, snap_id';
  OPEN cur FOR dynsql USING :dbid, :max_snap_time;
  
  LOOP
    FETCH cur INTO curi;
    EXIT when cur%NOTFOUND;
    if (printhead = 1 OR rowcount > 55 ) then
      dbms_output.put_line(rpad('DB Name', 12) || ' ' ||
                           rpad('Snap Id', 10) || ' ' ||
                           rpad('   Snap Started   ', 18) || ' ' ||
                           rpad('Snap Level', 10));
      dbms_output.put_line(rpad('------------', 12) || ' ' ||
                           rpad('----------', 10) || ' ' ||
                           rpad('------------------', 18) || ' ' ||
                           rpad('----------', 10));
      printhead := 0;
      rowcount := 0;
    end if;
    IF (rowcount = 0 OR 
        prev_dbname <> curi.db_name ) THEN
      dbms_output.put_line(' ');
      dbms_output.put_line(rpad(curi.db_name,12) || ' ' ||
                           rpad(to_char(curi.snap_id,99999990),10) || ' ' ||
                           rpad(curi.snapdat,18) || ' ' ||
                           rpad(to_char(curi.lvl,99),10));
    ELSE
      dbms_output.put_line(rpad(' ',12) || ' ' ||
                           rpad(to_char(curi.snap_id,99999990),10) || ' ' ||
                           rpad(curi.snapdat,18) || ' ' ||
                           rpad(to_char(curi.lvl,99),10));
    END IF;
    prev_dbname := curi.db_name;
    rowcount := rowcount + 1;
  END LOOP;
  CLOSE cur;
END;
/
clear break;
ttitle off;


--
--  Ask for the snapshots Id's which are to be compared

prompt
prompt
prompt Specify the Second Pair of Begin and End Snapshot Ids
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt Second Begin Snapshot Id specified: &&begin_snap2
prompt
prompt Second End   Snapshot Id specified: &&end_snap2
prompt


--
--  Set up the snapshot-related binds

variable bid2       number;
variable eid2       number;
begin
  :bid2      :=  &begin_snap2;
  :eid2      :=  &end_snap2;
end;
/

--
--  Error reporting

whenever sqlerror exit;
declare
  cspid_str     VARCHAR2(1024);
  cspid_cur     sys_refcursor;

  bsnapt  awr_pdb_snapshot.end_interval_time%type;
  bstart  awr_pdb_snapshot.startup_time%type;
  esnapt  awr_pdb_snapshot.end_interval_time%type;
  estart  awr_pdb_snapshot.startup_time%type;
  insts   AWRRPT_INSTANCE_LIST_TYPE;

begin
   
  cspid_str :=
    'select end_interval_time, startup_time
       from ' || '&view_loc' || '_snapshot
      where snap_id         = :snapid
        and dbid            = :dbid2';

  
  -- Check Begin Snapshot id is valid, get corresponding instance startup time
  open cspid_cur for cspid_str using :bid2, :dbid2;
  fetch cspid_cur into bsnapt, bstart;
  if cspid_cur%notfound then
    raise_application_error(-20200,
      'Begin Snapshot Id '||:bid2||' does not exist for this database');
  end if;
  close cspid_cur;

  -- Check End Snapshot id is valid and get corresponding instance startup time
  open cspid_cur for cspid_str using :eid2, :dbid2;
  fetch cspid_cur into esnapt, estart;
  if cspid_cur%notfound then
    raise_application_error(-20200,
      'End Snapshot Id '||:eid2||' does not exist for this database');
  end if;
  if :eid <= :bid then
    raise_application_error(-20200,
      'End Snapshot Id '||:eid2||
      ' must be greater than Begin Snapshot Id '||:bid2);
  end if;
  close cspid_cur;

 --
 -- Make sure at least one instance has not been re-started between
 -- begin and end snapshots
 --
 declare
   dynsql varchar2(1024);
 begin
   dynsql :=
     'select b.instance_number
      from ' || '&view_loc' || '_snapshot b, ' || '&view_loc' || '_snapshot e
      where b.dbid = :dbid2
        and b.snap_id = :bid2
        and e.dbid = :dbid2
        and e.snap_id = :eid2
        and e.startup_time = b.startup_time
        and e.instance_number = b.instance_number';
   execute immediate dynsql 
   bulk collect into insts
   using :dbid2, :bid2, :dbid2, :eid2;
 exception
  -- Check startup time is same for begin and end snapshot ids
  when no_data_found then
    raise_application_error(-20200,
      'All instances were shutdown between snapshots '||:bid2||' and '||:eid2);
  when others then raise;
 end;

end;
/
whenever sqlerror continue;



clear break compute;
repfooter off;
ttitle off;
btitle off;



--
-- Use report name if specified, otherwise prompt user for output file
-- name (specify default), then begin spooling
--
set termout off;
column dflt_name new_value dflt_name noprint;
select '&&1'||:inst_num||'_'||:bid||'_'||:inst_num2||'_'||:bid2||'&&2' dflt_name from dual;
set termout on;

prompt
prompt Specify the Report Name
prompt ~~~~~~~~~~~~~~~~~~~~~~~
prompt The default report file name is &dflt_name.  To use this name,
prompt press <return> to continue, otherwise enter an alternative.
prompt

set heading off;
column report_name new_value report_name noprint;
select 'Using the report name ' || nvl('&&report_name','&dflt_name')
     , nvl(decode(instr('&&report_name','.'),0,'&&report_name'||'&&2',
          '&&report_name'),'&dflt_name') report_name
  from sys.dual;

set heading off;
set pagesize 50000;
set echo off;
set feedback off;

undefine dbid
undefine inst_num
undefine num_days
undefine begin_snap
undefine end_snap

undefine dbid2
undefine inst_num2
undefine num_days2
undefine begin_snap2
undefine end_snap2


undefine dflt_name2

undefine 1
undefine 2

undefine view_loc_def
undefine script_viewloc

--
-- End of script

OHA YOOOO