仅为单个选择设置NLS_SORT变量

时间:2016-06-13 18:14:37

标签: sql oracle

美好的一天,

我的客户使用最初为MSSQL设计的应用程序,默认情况下可能会执行不区分大小写的搜索。但客户使用Oracle,因此需要一些额外的调整。

所以问题是:如何告诉Oracle使用给定的SELECT LIKE-Statement搜索不区分大小写,并具有以下限制?

  • ALTER SESSION不能单独使用(通过触发器:可能)
  • 来自同一会话的其他查询不得受到影响
  • 无法更改SELECT语句

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

1 个答案:

答案 0 :(得分: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