prog:which_package_call_this_sql
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 )
- 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 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
prog/which_package_call_this_sql.txt · Zuletzt geändert: 2015/09/24 08:53 von gpipperr