Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_operator

Einen Oracle Operator für die Verwendung in SQL definieren

min ab 8i

Mit mit "create operator" lässt sich ein Operator für die Verwendung in der Where Bedingung eines SQL Statements erstellen.

Leider muss man sich diesen Operator als einen Alias für eine Funktion vorstellen, eine echter eigener Vergleichsoperator in der Art „<wert1> <operator> <wert2>“ wie der Operator „=“ lässt sich nicht erstellen.

Der Operator zeigt auch immer auf eine Funktion, die die eigentliche Logik enthält.

Einfacher Operator ohne Überladung:

CREATE OR REPLACE OPERATOR <operator_name>
BINDING (data_type_in) RETURN <data_type_out> USING <function_name>; 

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:

CREATE OR REPLACE OPERATOR contains
BINDING (data_type_in) RETURN <data_type_out> USING <function_name>,
        (data_type_in) RETURN <data_type_out> USING <function_name>;

Verwendung findet diese Art von Opertator meist bei der Entwicklung von eigenen Erweiterungen nach dem Oracle Cartrige Konzept.

Ein typisches Beispiel ist der Oracle Text CONTAINS Operator.

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
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:=1;
 ELSE
  v_return:=0;
 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:=1;
 ELSE
  v_return:=0;
 END IF;  
  RETURN v_return;
END;
/
2. Schritt Operator definieren
CREATE OR REPLACE OPERATOR eq
BINDING(VARCHAR2, VARCHAR2) RETURN NUMBER USING string_eq,
       (NUMBER  , NUMBER  ) RETURN NUMBER USING num_eq
/  
 
COMMENT ON OPERATOR contains IS 'My Personal EQ Operator';
 
3. Operator verwenden
-- in der Where Clausel
-- String
SELECT * FROM dual WHERE eq('A','a')=1;
-- Number
SELECT * FROM dual WHERE eq(100,100)=1;
 
-- in der Treffer liste
SELECT eq('A','a') FROM dual;
4. Index Typ für den Operator anlegen

Damit das funktioniert ist etwas mehr Arbeit notwendig siehe http://docs.oracle.com/database/121/ADDCI/psbtree_example.htm#ADDCI4900

5. Statistik für den Operator anlegen

Mit „ASSOCIATE STATISTICS“ läßt sich dann auf der Tabelle mit der Spalte mit Werte für den eigenen Operator eine Statistik anlegen, die auch der Logik des eigenen Operators folgt.

⇒ siehe http://docs.oracle.com/database/121/ADDCI/ext_opt_ref.htm#ADDCI5082

Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
prog/oracle_operator.txt · Zuletzt geändert: 2015/12/23 11:05 von gpipperr