Список таблиц, используемых оператором SQL, может быть создан с использованием DBMS_UTILITY.EXPAND_SQL_TEXT
, временного представления, и запрос DBA_DEPENDENCIES
.
DBMS_UTILITY.EXPAND_SQL_TEXT
заботится о поиске таблиц, на которые ссылаются представления. Временное представление и DBA_DEPENDENCIES
затем генерируют список всех таблиц, используемых в расширенном операторе SQL.
Функция
create or replace function get_dependent_tables_from_sql(p_sql varchar2)
return sys.odcivarchar2list authid current_user is
v_expanded_sql clob;
v_tables sys.odcivarchar2list := sys.odcivarchar2list();
pragma autonomous_transaction;
begin
--Expand the SQL, which will go through all the recursive dependencies.
dbms_utility.expand_sql_text
(
input_sql_text => p_sql,
output_sql_text => v_expanded_sql
);
--Create a view with the expanded SQL.
execute immediate
'
create or replace view temp_view_for_dependencies as
select count(*) the_count
from
(
'||v_expanded_sql||'
)
';
--Find dependencies.
--(Use execute immediate to simplify compilation privileges.)
execute immediate
q'[
select distinct referenced_owner||'.'||referenced_name
from dba_dependencies
where name = 'TEMP_VIEW_FOR_DEPENDENCIES'
and owner = user
and referenced_type = 'TABLE'
]'
bulk collect into v_tables;
return v_tables;
end get_dependent_tables_from_sql;
/
Пример схемы
create table table1(col1 number, col2 number);
create table table2(col1 number, col2 number);
create table table3(col1 number, col2 number);
create table table4(col1 number, col2 number);
create table table5(col1 number, col2 number);
create or replace view view1 as select 1 a from dual;
Вызовfunction
select column_value table_name
from table(get_dependent_tables_from_sql(q'[
select *
from table1 t1
--ANSI joins
join table2 t2
on t1.col1 = t2.col1
where exists
(
select 1
--Oracle style joins, views.
from table3 t3, table4, view1
where t1.col2 = t3.col2
)
--A table that won't be in execution plan.
and exists (select 1 from table5 where 1 = 2)
]'))
order by 1;
TABLE_NAME
----------
JHELLER.TABLE1
JHELLER.TABLE2
JHELLER.TABLE3
JHELLER.TABLE4
JHELLER.TABLE5
SYS.DUAL
Предупреждения о других решениях
Будьте осторожны с решениями, которые включают пользовательский анализ SQL. Это одна из тех проблем, которая выглядит обманчиво легкой. Вы можете создать регулярное выражение, которое работает в 98% случаев, но буквально невозможно создать регулярное выражение, которое работает в 100% случаев.
Будьте осторожны, используя решения плана выполнения. Отследить объекты плана выполнения обратно в таблицы не так просто, как если бы использовался только индекс. И некоторые таблицы могут быть использованы в запросе, но исключены из плана выполнения из-за исключения соединения.