I have an table with thousands of SQL statements in a column called Queries. Any ideas on how to get just the table names from the statements by using a regular expression?
I have an table with thousands of SQL statements in a column called Queries. Any ideas on how to get just the table names from the statements by using a regular expression?
Were it me, I would tend to try to approach the problem a different way. Rather than writing a SQL parser (which would require much more than a regular expression unless you can guarantee that all the SQL statements using a very tiny subset of the available SQL grammar), I would tend to generate a query plan for each object and then query PLAN_TABLE
to see the objects that Oracle has to hit. You'd need to do an additional lookup for index accesses to find out what table the index is defined on but that should be reasonably straightforward.
If you go down this path, however, you'll be retrieving the base tables that your query actually touches rather than whatever views the queries may actually refer to. That is, if you have a query SELECT * FROM view_1
and view_1
, in turn, is defined as a query against table_a
and table_b
, only table_a
and table_b
will be part of the plan. And you would need to disable query_rewrite
for the session if you wanted to prevent the query plans from referencing materialized views if those materialized views were not specifically part of the query.
If, for each query, you do an
EXPLAIN PLAN FOR <<the query>>
you can then
SELECT DISTINCT object_owner, object_name, object_typeFROM plan_table
to get the list of objects. If OBJECT_TYPE
is like INDEX%
, you can then use the DBA_INDEXES
view (or ALL_INDEXES
or USER_INDEXES
depending on who owns the objects in question and what level of privileges you have) to determine what table that index is defined on
SELECT table_owner, table_nameFROM dba_indexesWHERE owner = <<object_owner from plan_table>>AND index_name = <<object_name from plan_table>>
So, for example, if I have a view view_1
create or replace view view_1asselect *from emp join dept using (deptno)
and a query
select * from view_1;
I can do
SQL> explain plan for select * from view_1;Explained.SQL> ed
Wrote file afiedt.buf1 SELECT distinct object_owner, object_name, object_type2* FROM plan_table
SQL> /OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------- -------------------------SCOTT DEPT TABLE
SCOTT PK_DEPT INDEX (UNIQUE)
SCOTT EMP TABLE
This tells me that the query is actually hitting the EMP
and DEPT
tables. It is also hitting the PK_DEPT
index so I can look to see what table that is defined on.
SQL> ed
Wrote file afiedt.buf1 SELECT table_owner, table_name2 FROM dba_indexes3 WHERE owner = 'SCOTT'4* AND index_name = 'PK_DEPT'
SQL> /TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT DEPT
As it turns out, that index is defined on the DEPT
table as well, so I know that only the EMP
and DEPT
tables in the SCOTT
schema are going to be involved in the query.