Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle - obtenha o nome da tabela do texto sql


Em vez de tentar escrever seu próprio analisador, você pode deixar o Oracle analisá-lo por meio do explain plan e, em seguida, observe a tabela de plano para ver a quais objetos ela se refere:
declare
  text varchar2(4000) := 'SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
    FROM DWH_OWNER.DWH_ACCOUNTS ACC,
         DWH_OWNER.DWH_PARTIES PT
   WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
    AND ACC.ACC_PT_KEY = PT.PT_KEY';
begin
  execute immediate 'explain plan for ' || text;
end;
/

select distinct object_owner, object_name
from plan_table
where object_type = 'TABLE';

OBJECT_OWNER                   OBJECT_NAME                  
------------------------------ ------------------------------
DWH_OWNER                      DWH_ACCOUNTS                  
DWH_OWNER                      DWH_PARTIES                   

Como @Aleksej sugeriu, se o otimizador usa apenas um índice (para que o plano de execução mostre acesso/varredura de índice sem atingir a tabela, porque todas as colunas relevantes estão no índice), a tabela de plano relata apenas o índice. Você pode permitir isso juntando-se à exibição de índice; se ele atingir a tabela também, ele apenas reportará para ambos:
select distinct case when pt.object_type = 'INDEX' then ai.table_owner
    else pt.object_owner end as owner,
  case when pt.object_type = 'INDEX' then ai.table_name
    else pt.object_name end as table_name
from plan_table pt
left join all_indexes ai on ai.owner = pt.object_owner
and ai.index_name = pt.object_name
where pt.object_type in ('TABLE', 'INDEX');

Você também precisa certificar-se de que a tabela de plano esteja vazia antes de cada chamada e consulta de plano de explicação para evitar confusão ou definir um ID de instrução para identificar quais tabelas estão relacionadas à consulta atual.