/*
* 
*  Author   : Vishal Gupta
*  Purpose  : Displays long running transactions
*  Parameter: 1 - Where Clause
* 
*  Revision History:
*  ===================
*  Date       Author        Description
*  ---------  ------------  -----------------------------------------
*  04-May-15  Vishal Gupta  Created
*
*/


/************************************
*  INPUT PARAMETERS
************************************/

UNDEFINE WHERE_CLAUSE
DEFINE WHERE_CLAUSE="&&1"


/************************************
*  CONFIGURATION PARAMETERS
************************************/

DEFINE BYTES_FORMAT="999,999"
--DEFINE BYTES_DIVIDER="1024"
--DEFINE BYTES_HEADING="KB"
DEFINE BYTES_DIVIDER="1024/1024"
DEFINE BYTES_HEADING="MB"
--DEFINE BYTES_DIVIDER="1024/1024/1024"
--DEFINE BYTES_HEADING="GB"


DEFINE COUNT_FORMAT=999,999
--DEFINE COUNT_DIVIDER="1"
--DEFINE COUNT_HEADING="#"
DEFINE COUNT_DIVIDER="1000"
DEFINE COUNT_HEADING="#1000"


PROMPT
PROMPT *********************************************
PROMPT * D A T A B A S E   T R A N S A C T I O N S
PROMPT *********************************************

COLUMN xid                      HEADING "XID"                      FORMAT a16 
COLUMN sid                      HEADING "SID"                      FORMAT 99999
COLUMN inst_id                  HEADING "I#"                       FORMAT 99 
COLUMN spid                     HEADING "SPID"                     FORMAT a6
COLUMN transaction_start_date   HEADING "Transaction|StartTime"    FORMAT a18 
COLUMN tran_duration            HEADING "Transaction|Duration"     FORMAT a15 
COLUMN transaction_status       HEADING "Tran|Status"              FORMAT a8 
COLUMN space                    HEADING "Space|Tran"               FORMAT a5 
COLUMN recursive                HEADING "Recu|rsive|Tran"          FORMAT a5 
COLUMN noundo                   HEADING "No|Undo|Tran"             FORMAT a4 
COLUMN ptx                      HEADING "Par'l|Tran"               FORMAT a5 
COLUMN used_undo                HEADING "Undo|(&&BYTES_HEADING)"   FORMAT &&BYTES_FORMAT
COLUMN username                 HEADING "UserName"                 FORMAT a20
COLUMN osuser                   HEADING "OS User"                  FORMAT a15 TRUNCATED
COLUMN status                   HEADING "Session|Status"           FORMAT a8
COLUMN state                    HEADING "Session|State"            FORMAT a12 TRUNCATED
COLUMN logon_time               HEADING "Logon Time"               FORMAT a18
COLUMN MACHINE                  HEADING "Machine"                  FORMAT a20 TRUNCATED
COLUMN process                  HEADING "Process"                  FORMAT a11 
COLUMN program                  HEADING "Program"                  FORMAT a20 TRUNCATED
COLUMN event                    HEADING "Event"                    FORMAT a30 TRUNCATED
--COLUMN last_call_et           HEADING "LastCall|(sec)"             FORMAT 999,999        
COLUMN last_call_et             HEADING "LastCall"                 FORMAT a12
COLUMN sql_child_number         HEADING "SQL|Child|No"             FORMAT 99

COLUMN log_io                   HEADING "Logical|IO|(&&COUNT_HEADING)"       FORMAT &&COUNT_FORMAT
COLUMN phy_io                   HEADING "Physical|IO|(&&COUNT_HEADING)"      FORMAT &&COUNT_FORMAT
COLUMN cr_get                   HEADING "Consistent|Gets|(&&COUNT_HEADING)"  FORMAT &&COUNT_FORMAT

COLUMN locked_mode              HEADING "Lock Mode"                FORMAT a10
COLUMN object_name              HEADING "ObjectName"               FORMAT a35



SELECT 
     --  t.xid   xid
     --, t.ptx_xid
      s.sid sid
     , t.inst_id
     , p.spid
     , s.status
     , TO_CHAR(t.start_date,'DD-MON-YY HH24:MI:SS')  transaction_start_date
     , FLOOR(sysdate - t.start_date) || 'd '
       || LPAD(FLOOR(MOD((sysdate - t.start_date) , 1) * 24 ) ,2) || 'h '
       || LPAD(FLOOR(MOD((sysdate - t.start_date) * 24 , 1) * 60 ) ,2) || 'm '
       || LPAD(FLOOR(MOD((sysdate - t.start_date) * 24 * 60 , 1) * 60 ) ,2) || 's ' tran_duration
     , t.status      transaction_status
     , t.space
     , t.recursive
     , t.noundo
     , t.ptx
     , DECODE(lo.locked_mode,
                0, 'None',           /* Mon Lock equivalent */
                1, 'Null',           /* N */
                2, 'Row-S (SS)',     /* L */
                3, 'Row-X (SX)',     /* R */
                4, 'Share',          /* S */
                5, 'S/Row-X (SSX)',  /* C */
                6, 'Exclusive',      /* X */
            TO_CHAR(lo.locked_mode)
            )  locked_mode
     , NVL2(o.owner,o.owner|| '.' || o.object_name || NVL2(o.subobject_name,'(' || o.subobject_name || ')','') , '' ) object_name
     , ROUND((t.used_ublk * p.value)/&&BYTES_DIVIDER) used_undo
     , t.log_io/&&COUNT_DIVIDER log_io
     , t.phy_io/&&COUNT_DIVIDER phy_io
     , t.cr_get/&&COUNT_DIVIDER cr_get
     , s.username
     , s.osuser
--     , s.sql_id
--     , s.sql_child_number
     , s.program
FROM gv$transaction t
     INNER JOIN gv$session s ON t.inst_id = s.inst_id   AND t.ses_addr = s.saddr 
     INNER JOIN gv$process p ON p.inst_id = s.inst_id   AND p.addr = s.paddr
     INNER JOIN v$parameter p ON p.name = 'db_block_size'
     LEFT OUTER JOIN gv$locked_object lo ON t.inst_id = lo.inst_id 
                                        AND s.sid     = lo.session_id 
                                        AND t.xidusn  = lo.xidusn 
                                        AND t.xidslot = lo.xidslot 
                                        AND t.xidsqn  = lo.xidsqn 
     LEFT OUTER JOIN dba_objects o ON lo.object_id = o.object_id
WHERE 1=1 and 2=2   
-- had to put AND clause other when no where clause is passed it was giving following error
-- SP2-0341: line overflow during variable substitution (>3000 characters at line 53)
 &&WHERE_CLAUSE
ORDER BY transaction_start_date asc
;

