sql >> データベース >  >> RDS >> Oracle

Oracle-SQLテキストからテーブル名を取得

    独自のパーサーを作成するのではなく、explain planを使用してOracleに解析させることができます。 、次にプランテーブルを見て、それが参照しているオブジェクトを確認します。

    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                   
    

    @Aleksejが提案したように、オプティマイザーがインデックスのみを使用する場合(したがって、関連するすべての列がインデックスにあるため、実行プランはテーブルにヒットせずにインデックスアクセス/スキャンを表示します)、プランテーブルはインデックスのみを報告します。インデックスビューに参加することで、それを可能にすることができます。それがテーブルにも当たった場合は、両方について報告するだけです:

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

    また、混乱を避けるために、各Explain Planの呼び出しとクエリの前に、プランテーブルが空であることを確認するか、現在のクエリに関連するテーブルを識別できるようにステートメントIDを設定する必要があります。




    1. サブスクライバーの投稿とユーザー自身の投稿を表示する

    2. ALTER SESSIONSETnls_date_formatはAPEXでは機能しません。ただし、SQLDeveloperでは機能します

    3. SpringデータJPAは1つの複合キーのみが自動インクリメントの問題です

    4. SQL Server ServerManagementStudioを使用したデータベースのインポート/エクスポート