====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 [[http://docs.oracle.com/cd/E11882_01/server.112/e40402/dynviews_3016.htm]| Database Reference 11g R2]] )
* **PLSQL_ENTRY_OBJECT_ID** - Object ID of the top-most PL/SQL subprogram on the stack (or NULL if there is no PL/SQL subprogram on the stack)
* **PLSQL_ENTRY_SUBPROGRAM_ID** - Subprogram ID of the top-most PL/SQL subprogram on the stack (or NULL if there is no PL/SQL subprogram on the stack)
* **PLSQL_OBJECT_ID** - Object ID of the currently executing PL/SQL subprogram (or NULL if executing SQL)
* **PLSQL_SUBPROGRAM_ID** - Subprogram ID of the currently executing PL/SQL object (or NULL if executing SQL)
Ü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 [[http://docs.oracle.com/cd/E18283_01/server.112/e17110/dynviews_3043.htm|Database Reference 11g R2]]
)
* **ROGRAM_ID** - Program identifier
* **PROGRAM_LINE#** - Program line number
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