2016-06-13 4 views
1

Guten Tag,Einstellung NLS_SORT Variablen für einen einzelnen select nur

meines Kunde nutzt eine Anwendung, die ursprünglich für MSSQL entworfen wurde, die wahrscheinlich Groß- und Kleinschreibung sucht standardmäßig tut. Aber der Kunde verwendet Oracle und benötigt daher einige zusätzliche Optimierungen.

Die Frage ist also: Wie kann ich Oracle sagen, dass eine bestimmte SELECT LIKE-Anweisung ohne Berücksichtigung der Groß-/Kleinschreibung unter den folgenden Einschränkungen ausgeführt werden soll?

  • ALTE SESSION kann nicht einzeln (durch Trigger: vielleicht) verwendet wird
  • Andere Anfragen von der gleichen Sitzung nicht
  • betroffen sein muss
  • Die SELECT-Anweisung nicht
  • verändert werden kann

Ich weiß über die Möglichkeit, NLS_SORT auf Systemebene zu setzen, aber dies wird die Leistung grundsätzlich zerstören, da alle Indizes deaktiviert sind.

+0

Wenn Sie nicht die select-Anweisung ändern können, vermutlich können Sie die Anwendung nicht modifizieren, um die Sitzung zu setzen und zurücksetzen Jede Seite davon wird genannt? Ein Login-Trigger könnte NLS für die gesamte Sitzung ändern, aber Sie haben das ausgeschlossen. Sind die Suchbegriffe immer fest, entweder ganz oben oder unten? Wenn ja, ist eine Aussicht vor dem/den Tisch (en) möglich? –

+0

Hallo Alex, ja das wäre eine Lösung, wenn es sich nicht auf Einfügungen und Updates auswirkt – PausBanderI

Antwort

1

Sie können DBMS_ADVANCED_REWRITE verwenden, um das SQL in eine case-insensitive Version umzuschreiben.

Solche Abfragen können sehr verwirrend sein und die Fehlersuche und Abstimmung erschweren. Das Paket hat auch einige Einschränkungen, die es unpraktisch machen können, wie beispielsweise Bind-Variablen nicht zu unterstützen.

1. Beispielschema

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. Die Abfrage ist zunächst Groß- und Kleinschreibung entspricht 0 Zeilen

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

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

3. Rewrite-Äquivalenz erstellen - fügen Sie eine Funktion 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. Nun ist die gleiche Abfrage ist Groß- und Kleinschreibung und entspricht 1 Reihe

SQL> alter session set query_rewrite_integrity = trusted; 

Session altered. 

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

    TOTAL 
---------- 
     1 
Verwandte Themen