当前位置:编程学习 > JAVA >>

如何解析sql语句并提取出表名

有大量的sql语句需要解析,要求提取出表名。用正则表达式好像不太好,里面有一些较复杂的语句。想用sql解析器来解析,生成一棵语法树,提取出表名就可以了,这样结果也准确些。
我用了gsp(General SQL Parser,http://www.sqlparser.com)。但是平均解析一条语句要173ms,速度上有些慢了。gsp里面也没有一些选项,可以关闭某些特性,提高解析速度,因为我只要表名就可以了。

各位有什么好的方法吗?开源库最好是java版的。 --------------------编程问答-------------------- 如果这些表名是已知的,少量的
那你可以把这些表名放在数组里,然后循环indexOf判断下 --------------------编程问答-------------------- 自己去写个JAVA方法来解析 --------------------编程问答-------------------- 编译原理 --------------------编程问答-------------------- 如果只是提取表用 java试试啊  

查到 from 后面的就是表名和别名呗 --------------------编程问答-------------------- 表名未知,每次扫描一条sql语句,提取表名。语句有很复杂的,包括join、存储过程之类的。自己写有点不太现实,正则的话也没法匹配所有情况。建立语法树正确率可以高一点。
问题是我找的gsp有点慢了,或者是我不知道它内部有哪些参数,可以优化。 --------------------编程问答-------------------- 表名都在from后面,提取from后面的就行了。
大致想了下几种情况,大家补充。
from table1
from table1 tb1
from table1, table2
from table1 tb1, table2 tb2
from table1, table2 tb2
...
解析这样的字符串应该不麻烦吧。 --------------------编程问答-------------------- 你可以直接联系gsp作者要求帮助。 --------------------编程问答-------------------- 为什么大家都觉得表名就在from后面呢,不是只有select这一种语句呀。

楼上的建议不错,我可以写信去问问。 --------------------编程问答-------------------- 太高深了
  没搞过
你可以去请教那些反射强的人
  我认为反射应该能解决吧 --------------------编程问答-------------------- create table 表名
select * from 表名
insert into 表名
delete from 表名
update 表名
select * from 表名 inner(left\right) join 表名
truncate table 表名
drop table 表名

其他的我想不出来了。总结一下,我觉得比研究什么语法树简单多了吧。
--------------------编程问答-------------------- 第一次看见这样的需求 --------------------编程问答-------------------- 我们这个就有这种需求,必须在应用中对数据库操作记录日志,而不是记录业务日志!不能使用数据库去记录,这样就只有去解析sql语句,使用代理JDBC中的一些对象去搞了~~~真烦人啊! --------------------编程问答-------------------- 如果使用的是 oracle 
可以在jvm参数中加上 -Doracle.jdbc.Trace=true 就可以记录数据库操作了。 --------------------编程问答-------------------- 你这样相当于做了一个人家数据库底层的语法解析的过程了 --------------------编程问答-------------------- 呵呵,
我现在还要用 c 从sql 中提取表名,奋斗中~ --------------------编程问答-------------------- 词法语法解析么,用antlr,应该能找到现成的语法文件

hibernate似乎就是用这个来解析hql的吧 --------------------编程问答--------------------
引用楼主 motivec 的回复:
有大量的sql语句需要解析,要求提取出表名。用正则表达式好像不太好,里面有一些较复杂的语句。想用sql解析器来解析,生成一棵语法树,提取出表名就可以了,这样结果也准确些。
我用了gsp(General SQL Parser,http://www.sqlparser.com)。但是平均解析一条语句要173ms,速度上有些慢了。gsp里面也没有一些选项,可以关闭某些特性,提高解析速度,因为我只要表名……


这些组件的功能并不是为了光提取表名 所以速度或许慢 如果你仅仅需要表名的话 你最好是根据你的业务写一个工具类 好在表名并不是太难获得 --------------------编程问答--------------------
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,