sql >> Databáze >  >> RDS >> Oracle

Oracle - získat název tabulky z textu SQL

Namísto pokusu o psaní vlastního analyzátoru můžete nechat Oracle analyzovat jej za vás pomocí explain plan a pak se podívejte do tabulky plánu, abyste viděli, na které objekty se vztahuje:

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                   

Jak navrhl @Aleksej, pokud optimalizátor používá pouze index (takže plán provádění zobrazuje přístup k indexu/skenování bez zásahu do tabulky, protože všechny relevantní sloupce jsou v indexu), tabulka plánu hlásí pouze index. Mohli byste to umožnit připojením k zobrazení indexu; pokud zasáhne také stůl, oznámí to pouze oběma:

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

Musíte se také ujistit, že tabulka plánu je prázdná před každým voláním plánu vysvětlení a dotazem, aby nedošlo k záměně, nebo nastavit ID příkazu, abyste mohli identifikovat, které tabulky souvisí s aktuálním dotazem.




  1. sqlalchemy func.group_concat a náhodné pořadí dat

  2. příkaz select vždy vrátí poslední vložený řádek v php mysql

  3. Vyplnění vstupního pole na základě výběru z rozbalovací nabídky pomocí Javascriptu

  4. LibreOffice:'com.mysql.jdbc.driver' nelze načíst