====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