2016-06-13 59 views
1

好日子,设置NLS_SORT变量单只选择

我的客户使用,最初设计用于MSSQL,这可能是默认做不区分大小写的搜索应用程序。但客户使用Oracle,因此需要额外的调整。

所以问题是:我该如何告诉Oracle如何使给定的SELECT LIKE-语句搜索不区分大小写以下限制?

  • ALTER SESSION不能单独使用(由触发器:也许)
  • 来自同一个会话的其他查询必须不受影响
  • 的SELECT语句不能改变

我知道在系统级别设置NLS_SORT的可能性,但这基本上会导致性能下降,因为所有索引都被禁用。

+0

如果你不能改变的select语句,想必你不能修改应用程序设置和重置会话它的任何一面被称为?登录触发器可能会改变整个会话的NLS,但你已经排除了这一点。搜索条件是否总是固定大小写 - 无论是完全上限还是下限?如果是这样,在表格前使用视图可能性? –

+0

嗨亚历克斯,是的这将是一个解决方案,如果它不影响插入和更新 – PausBanderI

回答

1

您可以使用DBMS_ADVANCED_REWRITE将SQL重写为不区分大小写的版本。

微妙地改变这样的查询可能会造成混淆,并且可能会使故障排除和调整变得困难。该软件包也有一些限制,可能会使其不切实际,如不支持绑定变量。

1.示例模式

SQL> drop table test1; 

Table dropped. 

SQL> create table test1(a varchar2(100)); 

Table created. 

SQL> insert into test1 values ('case INSENSITIVE'); 

1 row created. 

SQL> commit; 

Commit complete. 

2.查询最初是大小写敏感的和匹配0行

SQL> select count(*) total from test1 where a like '%case insensitive%'; 

    TOTAL 
---------- 
     0 

3.创建重写等价 - 增加一个LOWER功能

SQL> begin 
    2  sys.dbms_advanced_rewrite.declare_rewrite_equivalence(
    3    name    => 'case_insensitive_1', 
    4    source_stmt  => q'[select count(*) total from test1 where a like '%case insensitive%']', 
    5    destination_stmt => q'[select count(*) total from test1 where lower(a) like '%case insensitive%']', 
    6    validate   => false 
    7 ); 
    8 end; 
    9/

PL/SQL procedure successfully completed. 

4.现在,同样的查询是不区分大小写的匹配和1排

SQL> alter session set query_rewrite_integrity = trusted; 

Session altered. 

SQL> select count(*) total from test1 where a like '%case insensitive%'; 

    TOTAL 
---------- 
     1