Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle - obtenir le nom de la table à partir du texte sql

Plutôt que d'essayer d'écrire votre propre analyseur, vous pouvez laisser Oracle l'analyser pour vous via explain plan , puis examinez le tableau du plan pour voir à quels objets il fait référence :

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                   

Comme @Aleksej l'a suggéré, si l'optimiseur n'utilise qu'un index (le plan d'exécution affiche donc l'accès/l'analyse de l'index sans toucher la table, car toutes les colonnes pertinentes se trouvent dans l'index), alors la table du plan ne signale que l'index. Vous pouvez le permettre en vous joignant à la vue d'index ; s'il atteint également la table, il le signalera simplement pour les deux :

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');

Vous devez également vous assurer que la table de plan est vide avant chaque appel et requête de plan d'exécution pour éviter toute confusion, ou définir un ID d'instruction afin de pouvoir identifier les tables liées à la requête en cours.