Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_operator

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
prog:oracle_operator [2015/12/23 10:56] – [Einen eignen Operator in SQL definieren] gpipperrprog: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://docs.oracle.com/database/121/SQLRF/statements_6005.htm#SQLRF01304|"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:
 +<code sql>
 +CREATE OR REPLACE OPERATOR <operator_name>
 +BINDING (data_type_in) RETURN <data_type_out> USING <function_name>; 
 +</code>
 +
 +
 +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_out> USING <function_name>,
 +        (data_type_in) RETURN <data_type_out> USING <function_name>; 
 +
 +</code>
 +
 +
 +Verwendung findet diese Art von Opertator meist bei der Entwicklung von eigenen Erweiterungen nach dem [[http://docs.oracle.com/database/121/ADDCI/introduction.htm#ADDCI110|Oracle Cartrige Konzept]]. 
 +
 +Ein typisches Beispiel ist der [[http://docs.oracle.com/database/121/CCREF/cqoper.htm#CCREF0300|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==
 +
 +<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:=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;
 +/
 +</code>
 +
 +==2. Schritt Operator definieren ===
 +
 +
 +<code sql>
 +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';
 +     
 +</code>
 +
 +==3. Operator verwenden ===
 +
 +<code sql>
 +
 +-- 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;
 +
 +</code>
 +
 +==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 ====
 +
 +
 +Web:
 +
 +  * http://psoug.org/reference/operator.html
 +
 +Oracle 
 +  * https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/operators.htm