如题。
在oracle中,对一张表A检索的时候,假设字段a(Number型)是index,
1. select * from A where a = 1
2. select * from A where a = '1'Q1
用PreparedStatement 的setString来设定a的话,是不是在oracle端,是2的情况?
还是oracle自动会判断,如果是number的话,就执行1.?
Q2
2.的情况index是不是就不起作用了?

解决方案 »

  1.   

    不是,你可以查询一下oracle视图v$sql,
    一般是select * from A where a=:1这种参数绑定的sql形式,这样可以避免特殊符问题2.oracle优先是把字符串转成数字,刚刚试了一下,解释时会加上to_number,如果a='a'会报错
      

  2.   

    [a='a'会报错] a='a'当然会报错,我说的是a = '1'的情况
    不好意思,不是很明白楼上的回答。第2个问题的意思是: a(Number型)是索引的时候
    1. select * from A where a = 1 
    2. select * from A where a = '1' 
    上面2种写法,效率是不是不同。
    1.是正确的写法,因为a是索引,所以检索会很快。
    但是我不知道2.这样写,a的索引作用会不会保留?如果2.这种写法不行的话,就回到我第一个问题了。
    在java端,用PreparedStatement 的setString来设定一个number型的字段的时候,
    最后oracle执行的时候会按照哪种sql来检索呢?
    或者说大家平时用PreparedStatement 的时候,都是根据DB字段的类型来使用其中的方法的么?
    一般setString可以对Number型的字段付值也不会报错,而且java端,从画面过来的变量大多都是string型的,
    所以用setString会方便很多。
    但是碰到index这些字段,如果真的会影响效率的话,
    这样在java端的话,势必要按照DB字段的类型来使用PreparedStatement了。
      

  3.   

    oracle数字和字符串比较时,默认是字符串转成数字
    也就是默认转换为:select * from A where a=to_number('1')
    楼主直接看sql的解释计划就明白了