sql >> Database teknologi >  >> RDS >> Oracle

Oracle - få tabelnavn fra sql-tekst

I stedet for at prøve at skrive din egen parser, kan du lade Oracle parse den for dig via explain plan , og se derefter på plantabellen for at se, hvilke objekter den refererer til:

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 foreslog, hvis optimeringsværktøjet kun bruger et indeks (så udførelsesplanen viser indeksadgang/scanning uden at ramme tabellen, fordi alle de relevante kolonner er i indekset), så rapporterer plantabellen kun indekset. Du kan tillade det ved at tilslutte dig indeksvisningen; hvis det også rammer bordet, vil det bare rapportere det for begge:

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 skal også sørge for, at plantabellen er tom, før hver forklaring af planopkald og forespørgsel for at undgå forvirring, eller angive et sætnings-id, så du kan identificere, hvilke tabeller der er relateret til den aktuelle forespørgsel.




  1. Databasen bliver ikke opdateret med Attach-metoden

  2. Introduktion af agentbaseret databaseovervågning med ClusterControl 1.7

  3. Tilslutning til Oracle-database ved hjælp af Server Side Swift

  4. Postgres heltalsarrays som parametre?