2017-03-21 14 views
0

以下のSqlからすべてのテーブル名を取得するには?私のSQLは、最後のテーブル名だけを返します。OracleでREGEXヘルプが必要

with t as 
(select 'select col1, 
     (select max(col3) from dd3) max_timestamp 
    from dd1, 
     dd2 
where dd1.col1 = dd2.col1 
    and dd1.col1 in(select col1 from dd4)' sql_text from dual) 
select regexp_substr(regexp_substr(upper(sql_text), '\sFROM\s*(\w|\.|_)*'), '(\w|_|\.)+', 1,2) 
    from t 

ありがとう、 DD。

+0

コードに動的SQLがない場合は、参照してください--http://stackoverflow.com/questions/4852993/query-to-search-all-packages-for-table-and-or-column – OldProgrammer

+0

おかげでサム。我々は、レポートツールのログファイルからSQLのテキストをキャプチャし、今我々はそれを解析し、それが使用しているすべてのテーブル、ビュー、関数を抽出する必要があります。 – Nagma

答えて

0

これは、Oracleの質問よりも多くの正規表現に関する質問です。

REPLACE(REPLACE(sql,CHR(13),' '),CHR(10),NULL)を使ってsqlを実行して、すべての改行をスペースで置き換えると、クエリが1行に収まるようにするには、グループ1のすべてのテーブルを返すregex(FROMの後のもの)とリスト内の後続の項目のグループ3:複数のグループを持つ

/FROM ([A-Z0-9$#_]+)(,[\s]*([A-Z0-9$#_]+))*/gi 

は理想的ではないので、私は、代わりに完全な一致を見て(例えばhttps://regex101.com/r/OZUalH/1/を参照してくださいすべての試合があり、右、上の完全な一致を見ることになります1つ以上のテーブルが続いている)。

  • "my_tableに"
  • MY_TABLEを "A" と
  • MY_TABLE AS:

    しかし、私はあなた、これが処理されない句の式からこれらの有効なものとして、堅牢であることを行っていない警告してみましょうそれは私だったら

等...

、私はfunctioを記述しますnプランを実行してプランを実行する(即時実行の 'explain plan for ...')、プランテーブルからテーブルを抽出する(またはおそらくSYS.DBMS_XPLANを使用)

+0

Thanks Tony、私は解析し、plan_tableをチェックしましたが、問題はビューにあります。 plan_tableにはビュー名が表示されていませんでしたが、そのテーブルは不要です。パーザを書くことを試みる。 – Nagma

+0

あなたに気をつけて申し訳ありません..あなたは以下のような意味です。結果を返すわけではありません。 dd1からdd1、dd2までのmax_timestamp dd1.col1 = dd2.col1とdd1.col1の(select d col4 from dd4) 'sql_text from dual) regexp_substrを選択します。 ([(A-Z0-9 $#_] +)(、([\ s] *(FR) [A-Z0-9 $#_] +))* ')からt – Nagma