2016-06-13 5 views
1

良い一日のためにNLS_SORT変数を設定し、は単一選択のみ

私の顧客は、最初はおそらく、デフォルトでは大文字と小文字を区別しない検索を行っているMSSQL、ために設計されたアプリケーションを使用しています。しかし、顧客はOracleを使用しているため、余分な調整が必要です。

質問:どのようにして、特定のSELECT LIKE-Statement検索で大文字小文字を区別しないようにするには、次の制限がありますか?

  • 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 
    
    関連する問題