Den Name und die Zeilennummer eines PL/SQL Package für ein SQL Statement in der DB ermitteln

Über V$SESSION und V$SQL lässt sich das PL/SQL Package ermitteln das ein bestimmtes SQL Statement aufgerufen hat.

In V$SESSION steht uns zur Verfügung (aus der Doku Database Reference 11g R2 )

Über die V$SQL lässt sich sogar die Zeilennummer im PL/SQL Block ermitteln.

In der V$SQL kann verwendet werden (aus der Doku Database Reference 11g R2 )

Mit der ID kann über die DBA_OBJECTS der Objekt Name ermittelt werden.

SELECT * FROM dba_objects WHERE  object_id=&MY_PROGRAM_ID

Anlayse

Das ist sehr praktisch um zum Beispiel zu analysieren, welche PL/SQL Objekte in letzter Zeit aufgerufen und welche Zeile SQL Code hier verwendet wurde:

SELECT COUNT(*)
    , obj.owner
    , obj.object_type
    , obj.object_name
    , s.PROGRAM_LINE#
    , MIN(to_date(s.first_load_time,'YYYY-MM-DD/HH24:MI:SS')) AS min_first_load
    , MAX(to_date(s.first_load_time,'YYYY-MM-DD/HH24:MI:SS')) AS max_first_load    
  FROM dba_objects obj
     , v$sql s
 WHERE s.program_id = obj.object_id
   AND s.program_id != 0
 GROUP BY obj.owner
        , obj.object_type
        , obj.object_name
        , obj.subobject_name
        , s.PROGRAM_LINE#
ORDER BY obj.owner