如何从下面的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
答案 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子句表达式不会被处理:
等...
如果是我,我会编写一个函数来通过解释计划运行查询(立即执行'解释计划...')并从计划表中提取表格(或者可能使用SYS.DBMS_XPLAN)