prog:oracle_operator
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:oracle_operator [2015/12/23 10:56] – [Einen eignen Operator in SQL definieren] gpipperr | prog:oracle_operator [2015/12/23 11:05] (aktuell) – [Einen eignen Operator in SQL definieren] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====Einen Oracle Operator für die Verwendung in SQL definieren===== | ||
+ | **min ab 8i** | ||
+ | Mit mit [[http:// | ||
+ | |||
+ | |||
+ | Leider muss man sich diesen Operator als einen Alias für eine Funktion vorstellen, eine echter eigener Vergleichsoperator in der Art "< | ||
+ | |||
+ | Der Operator zeigt auch immer auf eine Funktion, die die eigentliche Logik enthält. | ||
+ | |||
+ | Einfacher Operator ohne Überladung: | ||
+ | <code sql> | ||
+ | CREATE OR REPLACE OPERATOR < | ||
+ | BINDING (data_type_in) RETURN < | ||
+ | </ | ||
+ | |||
+ | |||
+ | Ein Vorteil gegenüber der Verwendung eines gleich lautenden Funktion liegt in der Index Verwendung und dem Datentyp Handling (zum Beispiel für Überladungen von Datentypen). | ||
+ | |||
+ | |||
+ | Operator mit Datentyp Überlagerung: | ||
+ | <code sql> | ||
+ | CREATE OR REPLACE OPERATOR contains | ||
+ | BINDING (data_type_in) RETURN < | ||
+ | (data_type_in) RETURN < | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Verwendung findet diese Art von Opertator meist bei der Entwicklung von eigenen Erweiterungen nach dem [[http:// | ||
+ | |||
+ | Ein typisches Beispiel ist der [[http:// | ||
+ | |||
+ | |||
+ | ==Vorteil== | ||
+ | |||
+ | Der eigentliche Vorteil beim Einsatz von eigenen Operatoren liegt darin, das für den Operator ein eigener Index Typ aufgebaut werden kann, der komplexe Aufgaben erfüllen kann. | ||
+ | |||
+ | Wie zum Beispiel die Suche in DNS Sequenzen, GeoDaten oder einfach nur in JSON Konstrukten nach ganz eigenen Regel. | ||
+ | |||
+ | Auch kann C und Java als Programmiersprache in der DB eingesetzt werden um hier mehr Performance zu erzielen oder komplexe Algorithmen zu implementieren. | ||
+ | |||
+ | |||
+ | === Ein Beispiel für einen Operator === | ||
+ | |||
+ | Im Beispiel wollen wir einen Vergleichsoperator erstellen der zwei Werte vergleicht | ||
+ | |||
+ | |||
+ | ==1. Schritt - Funktionen anlegen== | ||
+ | |||
+ | <code sql> | ||
+ | create or replace function string_eq (p_wert1 varchar2, p_wert2 varchar2) | ||
+ | return number | ||
+ | is | ||
+ | v_return pls_integer; | ||
+ | begin | ||
+ | if upper(p_wert1) = upper(p_wert2) then | ||
+ | v_return: | ||
+ | else | ||
+ | v_return: | ||
+ | end if; | ||
+ | return v_return; | ||
+ | end; | ||
+ | / | ||
+ | create or replace function num_eq (p_wert1 number, p_wert2 number) | ||
+ | return number | ||
+ | is | ||
+ | v_return pls_integer; | ||
+ | begin | ||
+ | if p_wert1 = p_wert2 then | ||
+ | v_return: | ||
+ | else | ||
+ | v_return: | ||
+ | end if; | ||
+ | return v_return; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==2. Schritt Operator definieren === | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | CREATE OR REPLACE OPERATOR eq | ||
+ | BINDING(VARCHAR2, | ||
+ | | ||
+ | / | ||
+ | |||
+ | COMMENT ON OPERATOR contains IS 'My Personal EQ Operator'; | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==3. Operator verwenden === | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | -- in der Where Clausel | ||
+ | -- String | ||
+ | select * from dual where eq(' | ||
+ | -- Number | ||
+ | select * from dual where eq(100, | ||
+ | |||
+ | -- in der Treffer liste | ||
+ | select eq(' | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==4. Index Typ für den Operator anlegen == | ||
+ | |||
+ | Damit das funktioniert ist etwas mehr Arbeit notwendig siehe http:// | ||
+ | |||
+ | |||
+ | ==5. Statistik für den Operator anlegen== | ||
+ | |||
+ | Mit " | ||
+ | |||
+ | => siehe http:// | ||
+ | |||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | |||
+ | Web: | ||
+ | |||
+ | * http:// | ||
+ | |||
+ | Oracle | ||
+ | * https:// |
prog/oracle_operator.txt · Zuletzt geändert: 2015/12/23 11:05 von gpipperr