sql >> Databasteknik >  >> RDS >> Oracle

Oracle - hämta tabellnamn från sql-text

Istället för att försöka skriva din egen parser kan du låta Oracle analysera den åt dig via explain plan , och titta sedan på plantabellen för att se vilka objekt den refererar till:

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                   

Som @Aleksej föreslog, om optimeraren bara använder ett index (så att exekveringsplanen visar indexåtkomst/skanning utan att träffa tabellen, eftersom alla relevanta kolumner finns i indexet) så rapporterar plantabellen bara indexet. Du kan tillåta det genom att gå med i indexvyn; om det träffar bordet också kommer det bara att rapportera det för båda:

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

Du måste också se till att plantabellen är tom före varje förklarande plananrop och fråga för att undvika förvirring, eller ange ett uttalande-ID så att du kan identifiera vilka tabeller som är relaterade till den aktuella frågan.




  1. SQL är det möjligt att jämföra beställningar per timme och ta bort aktuellt lager?

  2. hur ändrar man postgresql lyssningsport i Windows?

  3. Partisk slumpmässig i SQL?

  4. persist java LocalDate i MySQL