      rem -------------------------------------------------------------------------
      rem Show users waiting for a lock, the locker and the
      rem SQL-Command they are waiting for a lock
      rem osuser, schema and PIDs are shown
      rem -----------------------------------------------------------------------
      rem
      --
      SET PAGES 24 LINES 100 FEED ON ECHO OFF TERMOUT ON HEAD ON
      COLUMN OS_LOCKER FORMAT A15 TRUNC
      COLUMN OS_WAITER FORMAT A15 TRUNC
      COLUMN LOCKER_SCHEMA FORMAT A15 TRUNC
      COLUMN WAITER_SCHEMA FORMAT A15 TRUNC
      COLUMN WAITER_PID FORMAT A10
      COLUMN LOCKER_PID FORMAT A10
      COLUMN SQL_TEXT_WAITER FORMAT A100 WRAP
      COLUMN DATABASE NOPRINT NEW_VALUE DATABASE
      COLUMN DATUM_ZEIT NOPRINT NEW_VALUE DATUM_ZEIT
      SET TERMOUT OFF ECHO OFF FEED OFF
      SET TERMOUT ON
      TTITLE CENTER 'Current Lock-Waits' SKIP 2
      --
      select /*+ ordered
      no_merge(L_WAITER)
      no_merge(L_LOCKER) use_hash(L_LOCKER)
      no_merge(S_WAITER) use_hash(S_WAITER)
      no_merge(S_LOCKER) use_hash(S_LOCKER)
      use_nl(O)
      use_nl(U)
      */
      /* first the table-level locks (TM) and mixed TM/TX TX/TM */
      S_LOCKER.OSUSER OS_LOCKER,
      S_LOCKER.USERNAME LOCKER_SCHEMA,
      S_LOCKER.PROCESS LOCKER_PID,
      S_WAITER.OSUSER OS_WAITER,
      S_WAITER.USERNAME WAITER_SCHEMA,
      S_WAITER.PROCESS WAITER_PID,
      'Table lock (TM): '||U.NAME||'.'||O.NAME||
      ' - Mode held: '||
      decode(L_LOCKER.LMODE,
      0, 'None', /* same as Monitor */
      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(L_LOCKER.LMODE))||
      ' / Mode requested: '||
      decode(L_WAITER.REQUEST,
      0, 'None', /* same as Monitor */
      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(L_WAITER.REQUEST))
      SQL_TEXT_WAITER
      from
      V$LOCK L_WAITER,
      V$LOCK L_LOCKER,
      V$SESSION S_WAITER,
      V$SESSION S_LOCKER,
      OBJ$ O,
      USER$ U
      where S_WAITER.SID = L_WAITER.SID
      and L_WAITER.TYPE IN ('TM')
      and S_LOCKER.sid = L_LOCKER.sid
      and L_LOCKER.ID1 = L_WAITER.ID1
      and L_WAITER.REQUEST > 0
      and L_LOCKER.LMODE > 0
      and L_WAITER.ADDR != L_LOCKER.ADDR
      and L_WAITER.ID1 = O.OBJ#
      and U.USER# = O.OWNER#
      union
      select /*+ ordered
      no_merge(L_WAITER)
      no_merge(L_LOCKER) use_hash(L_LOCKER)
      no_merge(S_WAITER) use_hash(S_WAITER)
      no_merge(S_LOCKER) use_hash(S_LOCKER)
      no_merge(L1_WAITER) use_hash(L1_WAITER)
      no_merge(O) use_hash(O)
      */
      /* now the (usual) row-locks TX */
      S_LOCKER.OSUSER OS_LOCKER,
      S_LOCKER.USERNAME LOCKER_SCHEMA,
      S_LOCKER.PROCESS LOCK_PID,
      S_WAITER.OSUSER OS_WAITER,
      S_WAITER.USERNAME WAITER_SCHEMA,
      S_WAITER.PROCESS WAITER_PID,
      'TX: '||O.SQL_TEXT SQL_TEXT_WAITER
      from
      V$LOCK L_WAITER,
      V$LOCK L_LOCKER,
      V$SESSION S_WAITER,
      V$SESSION S_LOCKER,
      V$_LOCK1 L1_WAITER,
      V$OPEN_CURSOR O
      where S_WAITER.SID = L_WAITER.SID
      and L_WAITER.TYPE IN ('TX')
      and S_LOCKER.sid = L_LOCKER.sid
      and L_LOCKER.ID1 = L_WAITER.ID1
      and L_WAITER.REQUEST > 0
      and L_LOCKER.LMODE > 0
      and L_WAITER.ADDR != L_LOCKER.ADDR
      and L1_WAITER.LADDR = L_WAITER.ADDR
      and L1_WAITER.KADDR = L_WAITER.KADDR
      and L1_WAITER.SADDR = O.SADDR
      and O.HASH_VALUE = S_WAITER.SQL_HASH_VALUE
      /
      TTITLE OFF
      COLUMN OS_LOCKER CLEAR
      COLUMN OS_WAITER CLEAR
      COLUMN LOCKER_SCHEMA CLEAR
      COLUMN WAITER_SCHEMA CLEAR
      COLUMN WAITER_PID CLEAR
      COLUMN LOCKER_PID CLEAR
      COLUMN SQL_TEXT_WAITER CLEAR
      COLUMN DATABASE CLEAR
      COLUMN DATUM_ZEIT CLEAR