上面的问题是我在做一个DAO源代码生成器碰到的,因为根据一个任意的SQL生成DAO源码时,我需要知道每个参数,也就是每个问号(?)所对应的类型,我是通过ResultSetMetaData获取字段类型的,所以需要知道每个参数是哪个表的哪个字段请各位大大们指点指点!分我有的是。

解决方案 »

  1.   

    select a.id, a.name, b.rolename from user a, role b where a.id = b.id and a.name like '%?%' and a.cretedate > ? and b.role in (select roles from group where groupid = ?)
      

  2.   

    select a.id, a.name, b.rolename from user a, role b where a.id = b.id and a.name like '%?%' and a.cretedate > ? and b.role in (select roles from group where groupid = ?)这样也行????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  3.   

    a.name like '%?%'  
    不行滴吧
      

  4.   

    各位大大,我仅仅是举了个SQL例子,我们先不管SQL的写法是否正确。我的问题就是想得到每个问号(?)所对应的列名称及表名称。说到底,我就想得到每个问号(也就是需要绑定的参数)的类型,如日期类型,字符串类型,数字类型等
      

  5.   

    请各位大大指点一二,分不够再加,解决问题马上结贴。该问题的另一个给分点:
    http://community.csdn.net/Expert/topic/4103/4103537.xml?temp=.9501764
      

  6.   

    http://www.china-pub.com/computers/ebook20001-25000/21497/ch02.rar
    http://www.china-pub.com/computers/ebook20001-25000/21497/ch03.rar这两个分别是java的关于一元算式的分析器代码和简单语句解释器的代码的讲解
    研究明白了它你就找到了解决你问题的思路了,我下了,但忙,没看,所以,嘿嘿...
      

  7.   

    谢谢majiaeryi(马甲而已),我先看看
      

  8.   

    其实按上面的sql来看,你要知道的都是where 子句里的东西,那么很简单:“a.name like ?” 里的'?'必定是与a.name 类型匹配的,在ResultSetMetaData里面是可以查出该字段(a.name)的类型的,于是就知道了'?'的类型。不知道这合不合楼主的要求
      

  9.   

    第一个问号对应的列名称及表名称分别是列a.name 和表user a, role b_______________________________________如果是这样的话,我想了一个大概的思路
    由于可能存在
    select a.col1,a.col2 ...
    from (select ... from b where col=?) as a
    where length(a.col1) > ?所以处理的时候不能简单的说从右分析起,取?左侧的 from 和 where之间的就是它对应的表,比较符号旁边的就是它的字段.因为有括号的优先级在那放着1:括号中的内容替换
    可以从第一个右括号分析起,(为什么从第一个右括号分析起,自己想想)
    找到第一个对应的括号,判断是否其中内容是否存在select ,存在则为嵌套表,否则则为字段,然后把括号和括号中的内容替换
    并记录下来
    接着找,接着替换,...2:字段名的获取
    字段类的,直接排除函数、运算符号,取得字段的名字,如果有表的别名,别名也记录下来3:表名获取
    取表名根据最初分析的时候记录的索引信息去配对因为想的很粗糙,所以写的简单,干活了~~~
      

  10.   

    to cxydbydyq(紅衣主教):我现在就是用正则表达式去分析SQL语句,然后通过ResultSetMetaData得到该字段的类型,但主要是不能正确的分析所有可能的SQL语句,比如有嵌套子查询,有between,有in等,有exist等等谢谢!
      

  11.   

    to majiaeryi(马甲而已):你分析的有道理,SQL语句的可能性多,导致实现可能有点复杂。不过我也一直想,有没有比较简单的方法,而且我也不必考虑性能等谢谢你的指点!
      

  12.   

    该问题的另外2个给分点:http://community.csdn.net/Expert/topic/4105/4105137.xml?temp=.6379816
    http://community.csdn.net/Expert/topic/4103/4103537.xml?temp=.1547815
      

  13.   

    我现在有个简单的想法:1:首先把每个?之外的其他?替换为null,这样有多少个?就有多少条替换后的SQL
    2:由于类型的种类有限,这样我就一个个的试,去运行该替换后的SQL,当不出现异常的类型就是该?对应的类型
    3:至于每个?对应的字段名的获取,就取它左边最近的非(= > < <> <= >= like between and)等保留字前面的字符串
    不知道各位大大还有没有更好的方法?
      

  14.   

    对于上面的每个?对应的字段名的获取,各位大大有什么好方法?而且对于between xxx and ?还不能取它左边最近的非保留字符串,必须取between前面的非保留字符串
      

  15.   

    事实上这种语法分析单单通过正则表达式是解决不了的,
    1、要么就是把所有操作符都列出来一个个分析
    2、要么可以试一下这个,有对应的语法文件的
    http://www.antlr.org/
      

  16.   

    正则表达式够呛能行,个人觉得还是用antlr老老实实走编译原理那一套,有一个朋友想拿到SQL中所有的表名(http://community.csdn.net/Expert/topic/4122/4122946.xml?temp=.8651087),你其实是更复杂一些,需要所有的列名全称和双目运算符两边的问号,个人觉得只有编译原理的知识才能解决
      

  17.   

    用编译原理拿到所有的列名全称和双目运算符两边的问号之后,你就可以通过ResultSetMetaData或者去看syscolumns得到表列的类型了,这个不难,关键是语法分析难