比方 select person_num from PERSON ,如果 person_num 是number型的字段, 
那么自动把这句sql 替换成 select to_char(person_num) from PERSON. 
因为我们改造的这个jsp/j2ee项目,查询数据库用的是proC写的服务,但是现成的服务不支持number型。所以只能把sql 
替换之后传给服务, 我们现在的做法是人工查看字段类型,人工替换sql,实在太费劲了,而服务没办法改。 需要改造的地方有三点: 1.无精度number型直接to_char。 
2.有精度number型,用to_char(xxx,'9999,99') 
3.date型用to_char(xxx,'yyyymmdd HH24:MI:SS') 
能不能做到我把 sql 从页面提出来 ,程序自动给我分析,自动帮我替换,而不用我手动去查字段类型了 

解决方案 »

  1.   

    可以写个存储过程,把select person_num from PERSON 等sql 保存到一个表里进行处理
      

  2.   

    如果你是有自己的api封装了查询这一块的功能的话,可以修改这个api,sql不变,不过是在reterive数据以后,处理一下,根据字段的数据类型,安装你的要求做一下处理,
      

  3.   

    2.有精度number型,用to_char(xxx,'9999,99') 
    有精度无精度是什么意思,直接to_char()都一样的吧?
    select case when length(person_num)-length(replace(person_num,'-','')=2
      then to_char(person_num,'yyyymmdd HH24:MI:SS')
      else to_char(person_num)end person_num from PERSON 
    这个语句要保证,如果person_num为字符型,里面不会包括两个'-'。若根本没有包含'-',更好办
    select case when instr(person_num,'-')>0
      then to_char(person_num,'yyyymmdd HH24:MI:SS')
      else to_char(person_num)end person_num from PERSON 
    如果精度也要区分,就不好办了
    可以用下列语句试试,不过效率可能不高
    select case (select data_type from user_tab_cols where table_name='PERSON' and column_name='PERSON_NUM') 
      when 'NUMBER' then to_char(person_num)
      when 'date' then to_char(person_num,'yyyymmdd HH24:MI:SS')
      when ... end person_num from person
    判断太多太冗余,因为每个列的所有记录的类型必定都一样
    你可以将select data_type from user_tab_cols where table_name='PERSON' and column_name='PERSON_NUM'提取出来,自动判断类型后
    决定执行select person_num from...
    还是select to_char(person_num,..) from 
    还是...
      

  4.   

    2.有精度number型,用to_char(xxx,'9999,99') 
    有精度无精度是什么意思,直接to_char()都一样的吧?
    select case when length(person_num)-length(replace(person_num,'-','')=2
      then to_char(person_num,'yyyymmdd HH24:MI:SS')
      else to_char(person_num)end person_num from PERSON 
    这个语句要保证,如果person_num为字符型,里面不会包括两个'-'。若根本没有包含'-',更好办
    select case when instr(person_num,'-')>0
      then to_char(person_num,'yyyymmdd HH24:MI:SS')
      else to_char(person_num)end person_num from PERSON 
    如果精度也要区分,就不好办了
    可以用下列语句试试,不过效率可能不高
    select case (select data_type from user_tab_cols where table_name='PERSON' and column_name='PERSON_NUM') 
      when 'NUMBER' then to_char(person_num)
      when 'date' then to_char(person_num,'yyyymmdd HH24:MI:SS')
      when ... end person_num from person
    判断太多太冗余,因为每个列的所有记录的类型必定都一样
    你可以将select data_type from user_tab_cols where table_name='PERSON' and column_name='PERSON_NUM'提取出来,自动判断类型后
    决定执行select person_num from...
    还是select to_char(person_num,..) from 
    还是...