sql >> Database >  >> RDS >> Oracle

Oracle - haal de tabelnaam op uit sql-tekst

In plaats van te proberen uw eigen parser te schrijven, kunt u Oracle deze voor u laten ontleden via explain plan , en kijk dan naar de plantabel om te zien naar welke objecten het verwijst:

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                   

Zoals @Aleksej suggereerde, als de optimizer alleen een index gebruikt (dus het uitvoeringsplan toont indextoegang/scan zonder de tabel te raken, omdat alle relevante kolommen in de index staan), dan rapporteert de plantabel alleen de index. Je zou dat kunnen toestaan ​​door deel te nemen aan de indexweergave; als het ook op tafel komt, rapporteert het het gewoon voor beide:

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

U moet er ook voor zorgen dat de plantabel leeg is vóór elke aanroep en query voor het uitleggen van een plan om verwarring te voorkomen, of een instructie-ID instellen zodat u kunt identificeren welke tabellen betrekking hebben op de huidige query.




  1. Fout 310:Staging mislukte implementatie - Grails-app in Cloud Foundry

  2. Wat is een ODBC-compatibele database?

  3. MySQL PREPARE-instructie in opgeslagen procedures

  4. Verwijs naar een alias voor de kolomnaam in de WHERE-component