最近从 MSSQL 转移到 oracle,自己草草学习了下,还真不简单。感觉还挺喜欢 oracle 的,不过这个大小写区分查询,也着实坑了爹。查阅了一下,方法有:1、
CREATE INDEX I_emp_ENAME ON emp(UPPER(EName));坑爹的是查询一定要使用SELECT * FROM emp WHERE UPPER(ENAME) = 'ALLEN'如果不使用“UPPER(ENAME)”,就不让使用索引查询了……2、还有一种是每次连接都在会话中更改。这点也坑爹。请问有其他办法吗?可以使用索引:CREATE INDEX I_emp_ENAME ON emp(EName);也不用处处加 UPPER 或 LOWER 函数。

解决方案 »

  1.   

    你这个1用的是函数索引,当然只有用该函数时才会走该索引咯。
    同从mssql刚转oracle,一起学习吧。
    这个函数索引就是为了mssql那种只要一用函数在左边就杯具的辅助功能而已吧,一般还是不会用的
      

  2.   

    你可以ENAME都只让存大写或者小写,不就完事了。
      

  3.   


    我知道有一个方法。但据说会引起全表扫描。但我的测试却没有。奇怪。alter session set NLS_SORT=BINARY_CI;
    alter session set NLS_COMP=LINGUISTIC;小心NLS_SORT和NLS_COMP的设置成为性能杀手
    还有此篇文章也表示性能问题:http://huajiang.iteye.com/blog/510507
      

  4.   

    还有,为什么CREATE GLOBAL TEMPORARY TABLE t_test ON COMMIT DELETE ROWS
    AS select * from NLS_SESSION_PARAMETERS;无法插入临时表数据?只有复制了表结构?
      

  5.   

    1.因为你建立的函数索引,所以你查询时当然要使用upper函数,才会走索引啊。
    如果建立的是普通索引,就不需要每次转换了啊。2.删除原来的函数索引,建立新的普通索引。
      

  6.   

    有数据,只是你建立的是ON COMMIT DELETE ROWS ,一提交,数据就删除了。