2016-06-13 29 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