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
あなたはselect文を変更できない場合は、おそらくあなたは、設定とセッションをリセットするようにアプリケーションを変更することはできませんどちらかの側が呼び出されていますか?ログイントリガーはセッション全体のNLSを変更することができますが、あなたはそれを排除しました。検索用語は常に完全に大文字か小文字かのどちらかで固定されていますか?もしそうなら、テーブルの前のビューを使用する可能性はありますか? –
こんにちはアレックス、それは挿入と更新に影響しない場合、これは解決策になります – PausBanderI