The following steps demonstrate how to use the V$SQL PROGRAM_ID, and PROGRAM_LINE# columns to track SQL back to a PL/SQL stored program unit.
First I create a simple procedure that executes some SQL statements:
SQL> create or replace procedure MY_USER.MY_PROC is 2 x int; 3 begin 4 -- 5 -- procedure to count some dictionary views 6 -- 7 select count(*) 8 into x 9 from dba_views; 10 11 select count(*) 12 into x 13 from dba_tables; 14 15 select count(*) 16 into x 17 from dba_synonyms; 18 19 select count(*) 20 into x 21 from dba_objects; 22 23 end; 24 / Procedure created.
After the procedure has run, I can track the SQL information in V$SQL, using the normalized version of the SQL text.
SQL> select sql_id, sql_text 2 from v$sql 3 where sql_text like 'SELECT COUNT%DBA_OBJECTS'; SQL_ID SQL_TEXT ------------- ---------------------------------------------- ff35fbgz27513 SELECT COUNT(*) FROM DBA_OBJECTS
For this SQL_ID, I mine the PROGRAM_ID and PROGRAM_LINE# columns, which track the SQL back to its parent procedure.
SQL> select PROGRAM_ID, PROGRAM_LINE# 2 from v$sql 3 where sql_id = 'ff35fbgz27513'; PROGRAM_ID PROGRAM_LINE# ---------- ------------- 102001 19 SQL> select owner, object_name 2 from dba_objects 3 where object_id = 102001; OWNER OBJECT_NAME ------------------------------ ----------------- MY_USER MY_PROC
DISCLAIMER: We've captured these popular historical magazine articles for your reference. Links etc contained within these article possibly won't work. These articles are provided as-is with no guarantee that the information within them is the best advice for current versions of the Oracle Database.