Oracle需要REGEX帮助

时间:2017-03-21 21:48:10

标签: regex oracle

如何从下面的Sql获取所有表名?我的sql只返回最后一个表名。

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

1 个答案:

答案 0 :(得分:0)

这是一个比Oracle问题更像是一个正则表达式问题。

如果您可以通过REPLACE(REPLACE(sql,CHR(13),' '),CHR(10),NULL)运行sql以用空格替换所有换行符,以便查询适合单行,这里的正则表达式将返回组1中的所有表(对于之后的那些表) FROM)和第3组用于列表中的后续项目:

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

拥有多个组并不理想,所以我会查看完整匹配,请参阅https://regex101.com/r/OZUalH/1/以获取示例(请参阅右侧的完整匹配,其中每个匹配后跟一个或多个表)。

但是让我警告你,这不会很健壮,因为这些有效的FROM子句表达式不会被处理:

  • " MY_TABLE"
  • MY_TABLE as A
  • MY_TABLE AS" a"

等...

如果是我,我会编写一个函数来通过解释计划运行查询(立即执行'解释计划...')并从计划表中提取表格(或者可能使用SYS.DBMS_XPLAN)