Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  2/2007  Pfeil  Datenbanken
suche: 
Der Artikel richtet sich an Entwickler und Administratoren, die eine Replikation von Daten zwischen verschiedenen Datenbanken aufsetzen wollen.

Glossar

Rule
Regel, nach der ausgewertet wird, ob Daten verwendet oder verworfen werden.
Rule Set
Gruppe von Regeln
Rule Condition
Komponente einer Regel, die aus Ausdrücken und/oder Bedingungen besteht. Das Ergebnis ist TRUE, FALSE oder NULL.
Rules Engine
Ein Built-In als Funktionalität, um die Rule Sets zu evaluieren.
Action Context
Optionale Information, die einer Rule zur späteren Verwendung in einer Meldung zugewiesen wird.
Oracle Streams
Funktionalitäten, mit denen Daten zwischen Datenbanken verteilt werden können.
Event
Ereignis, das von einem Client oder der Rules Engine angestoßen wird.


Reihe Oracle Objekttypen von A - Z (Teil III):

"E” wie Evaluation Context


In unserer Reihe der Oracle Objekttypen sind wir nun beim Buchstaben "E" angekommen und stellen Ihnen den Oracle Objekttyp "Evaluation Context" vor. Der Evaluation Context ist ein Datenbankobjekt, in dem Variablenwerte gespeichert und/oder Tabelleninhalte abgelegt werden, so dass sie von Rule Conditions referenziert werden können. Diese Datenbankobjekte können bei der Funktionalität Oracle Streams (siehe ORDIX News Artikel "Information Sharing mit Oracle Streams") benutzt werden.

Wofür benötigt man Evaluation Context?

Bei Oracle Streams werden aus den Redolog-Daten Befehle und Daten extrahiert. Dieses Prinzip findet beispielsweise bei der Logical Standby Datenbank Anwendung. Mit Streams ist es darüber hinaus möglich, mit Hilfe von Regeln nur bestimmte Informationen aus dem Redolog-Strom zu gewinnen. Die Regeln bestehen aus Bedingungen, die auf Daten angewendet werden. Als Analogie: Stellen Sie sich die Rule Condition als where-Bedingung und den Evaluation Context als from-Klausel vor. Die Interpretation und Auswertung der Daten übernimmt der Evaluation Context. Die Rule Condition wird in dem Schema ausgewertet, in dem sich der Evaluation Context befindet.

Zusammenhang zwischen Evaluation Context und Rule Condition

Ein Alias dep zeigt auf eine Tabelle department im Schema hr. Die Variablen loc_id1 und loc_id2 haben beide den Typ NUMBER. Die Rule Condition lautet dep.location_id in (:loc_id1, :loc_id2) und ist in einem Evaluation Context namens hr_evaluation_context enthalten. In diesem Fall ergibt die Rule Condition TRUE für die Datensätze der Tabelle mit zutreffender Location-Id zu loc_id1 oder loc_id2. Die Regel kann ohne die Informationen aus dem Evaluation Context nicht ausgewertet werden.

Implizite oder explizite Variablenwerte

Die Variablenwerte können explizit bei der Evaluierung des Evaluation Context oder implizit durch Events (Ereignisse) gesetzt werden. Eine Evaluierung wird über Parameter durch den Aufruf von dbms_rule.evaluate durchgeführt. Implizite Variablen werden bei der Erstellung des Evaluation Context mit Aufruf von CREATE_EVALUATION_CONTEXT im Package DBMS_RULE_ADM gesetzt.

Rule Set Evaluation Prozess

Der Prozess der Evaluierung wird wie folgt durchlaufen:

    Abb. 1: Rule Evaluation Context.
  1. Ein vom Client definiertes Event wird ausgelöst.
  2. Der Client initiiert die Evaluierung eines Rule Sets durch Senden von Informationen mit der Prozedur DBMS_RULE.EVALUATE an die Rules Engine. Sowohl Rule Set als auch Evaluation Context spezifiziert der Client.
  3. Die Rules Engine wertet die zugehörigen Rule Sets durch den entsprechenden Evaluation Context aus.
  4. Die Ergebniswerte der zugehörigen Rules sind TRUE, FALSE oder NULL. Optional gibt es auch einen Action Context.
  5. Der Client erhält die Ergebnisse von der Rules Engine.
  6. Mit diesen Ergebnissen führt der Client Aktionen aus.

Abbildung 1 illustriert diese Vorgehensweise.

Anlegen eines Evaluation Context

Mit der Syntax aus Abbildung 2 wird ein Evaluation Context angelegt. Dort wird eine explizite Variable priority vom Typ NUMBER dem Evaluation Context supportctx zugewiesen. Ein zusätzlicher Kommentar wird in der Datenbank angelegt, um die Bedeutung dieses Evaluation Context zu erklären.

DECLARE 
vt SYS.RE$VARIABLE_TYPE_LIST; 
BEGIN 
  vt := SYS.RE$VARIABLE_TYPE_LIST ( SYS.RE$VARIABLE_TYPE
    ('priority', 'NUMBER', NULL, NULL)); 
  DBMS_RULE_ADM.CREATE_EVALUATION_CONTEXT
    ( evaluation_context_name => 'supportctx',
      variable_types => vt,
      evaluation_context_comment => 'Support Problem Definition'); 
END; 
/ 
Abb. 2: Beispiel zum Anlegen eines Evaluation Context.

Anlegen eines Rule Sets

Ein Evaluation Context bekommt notwendigerweise Rule Sets und/oder Rules zugewiesen. Im Beispiel in Abbildung 3 wird im Evaluation Context supportctx ein Rule Set regelset angelegt. Ein zusätzlicher Kommentar dient der Lesbarkeit und wird im Data Dictionary abgelegt.

BEGIN 
DBMS_RULE_ADM.CREATE_RULE_SET ( 
  rule_set_name => 'regelset', 
  evaluation_context => 'supportctx', 
  rule_set_comment => 'Support Regeln'); 
END; 
/ 
Abb. 3: Beispiel zum Anlegen eines Rule Sets, Zuordnung zum Evaluation Context.

Anlegen von Rules

Mit dem Beispiel in Abbildung 4 werden drei Regeln angelegt, denen jeweils ein Action Set zugeordnet ist. Der Action Context besteht aus Name-Wert-Kombinationen. Der Name "Center" wird bei Rule r1 mit dem Wert "Paderborn" belegt, bei der Rule r2 mit "Berlin". Die Rule r3 bekommt den Namen "Alert" mit dem Wert "Erwin Mustermann".

DECLARE 
  ac SYS.RE$NV_LIST; 
BEGIN 
  ac := SYS.RE$NV_LIST(NULL); 
  ac.ADD_PAIR('CENTER', SYS.AnyData.CONVERTVARCHAR2('Paderborn')); 
  DBMS_RULE_ADM.CREATE_RULE	( rule_name => 'r1',
    condition => ':priority > 2',
    action_context => ac,
    rule_comment => 'Probleme niedriger Priorität'); 
  ac := SYS.RE$NV_LIST(NULL); 
  ac.ADD_PAIR('CENTER', SYS.AnyData.CONVERTVARCHAR2('Berlin')); 
  DBMS_RULE_ADM.CREATE_RULE	( rule_name => 'r2',
    condition => ':priority <= 2',
    action_context => ac,
    rule_comment => 'Probleme hoher Priorität'); 
  ac := SYS.RE$NV_LIST(NULL); 
  ac.ADD_PAIR('ALERT', 
    SYS.AnyData.CONVERTVARCHAR2('Erwin Mustermann')); 
  DBMS_RULE_ADM.CREATE_RULE	( rule_name => 'r3',
    condition => ':priority = 1',
    action_context => ac,
    rule_comment => 'Dringendes Problem'); 
END; 
/ 
Abb. 4: Beispiel zum Anlegen von Rules.

Zuweisung von Rules zu einem Rule Set

Mit der Syntax aus Abbildung 5 werden die Rules zu einem Rule Set zugeordnet und gleichzeitig zu einem Rule Set zusammengefasst. Die Zuordnung erfolgt über DBMS_RULE_ADM.ADD_RULE sowie die Namen von Rule und Rule Set.

BEGIN 
DBMS_RULE_ADM.ADD_RULE( rule_name => 'r1', rule_set_name => 'regelset'); 
DBMS_RULE_ADM.ADD_RULE( rule_name => 'r2', rule_set_name => 'regelset'); 
DBMS_RULE_ADM.ADD_RULE( rule_name => 'r3', rule_set_name => 'regelset'); 
END; 
Abb. 5: Beispiel für die Zuordnung von Rules zu einem Rule Set.

Nutzung des Evaluation Context in einer Prozedur

In der Abbildung 6 wird die Benutzung vom Evaluation Context innerhalb einer Prozedur verdeutlicht. Diese kann dann z. B. wie in Abbildung 7 aufgerufen werden und erzeugt die dort dargestellten Ausgaben.

CREATE OR REPLACE PROCEDURE 
  problem_dispatch (priority NUMBER) 
IS 
  vv         SYS.RE$VARIABLE_VALUE; 
  vvl        SYS.RE$VARIABLE_VALUE_LIST; 
  truehits   SYS.RE$RULE_HIT_LIST; 
  maybehits  SYS.RE$RULE_HIT_LIST; 
  ac         SYS.RE$NV_LIST; 
  namearray  SYS.RE$NAME_ARRAY; 
  name       VARCHAR2(30); 
  cval       VARCHAR2(100); 
  rnum       INTEGER; 
  i          INTEGER; 
  status     PLS_INTEGER; 
BEGIN 
  vv := SYS.RE$VARIABLE_VALUE('priority', 
      SYS.AnyData.CONVERTNUMBER(priority)); 
  vvl := SYS.RE$VARIABLE_VALUE_LIST(vv); 
  truehits := SYS.RE$RULE_HIT_LIST(); 
  maybehits := SYS.RE$RULE_HIT_LIST(); 
  DBMS_RULE.EVALUATE( 
    rule_set_name => 'regelset',
    evaluation_context => 'supportctx', 
    variable_values => vvl, 
    true_rules => truehits, 
    maybe_rules => maybehits); 
  FOR rnum IN 1..truehits.COUNT LOOP 
    DBMS_OUTPUT.PUT_LINE('Nutze Regel '|| truehits(rnum).rule_name); 
    ac := truehits(rnum).rule_action_context; 
    namearray := ac.GET_ALL_NAMES; 
    FOR i IN 1..namearray.count loop 
      name := namearray(i); 
      status := ac.GET_VALUE(name).GETVARCHAR2(cval); 
      IF (name = 'CENTER') then 
        DBMS_OUTPUT.PUT_LINE('Zuweisung erhält: ' || cval); 
        ELSIF (name = 'ALERT') 
      THEN 
        DBMS_OUTPUT.PUT_LINE('Alarm erhält: '|| cval); 
      END IF; 
    END LOOP; 
  END LOOP; 
END; 
/
Abb. 6: Beispiel zur Benutzung von Evaluation Context.

SQL> EXECUTE problem_dispatch(1);
Nutze Regel "SUPPORT"."R3
Alarm erhält: Erwin Mustermann
Nutze Regel "SUPPORT"."R2"
Zuweisung erhält: Berlin
 
PL/SQL-Prozedur erfolgreich abgeschlossen.
 
SQL> EXECUTE problem_dispatch(2);
Nutze Regel "SUPPORT"."R2"
Zuweisung erhält: Berlin
 
PL/SQL-Prozedur erfolgreich abgeschlossen.
 
SQL> EXECUTE problem_dispatch(3);
Nutze Regel "SUPPORT"."R1"
Zuweisung erhält: Paderborn
 
PL/SQL-Prozedur erfolgreich abgeschlossen.
Abb. 7: Aufruf und Ausgaben zu den Beispielen.

Zu Beginn der Prozedur erhält die explizite Variable priority den Übergabeparameter. Die Evaluierung wird über den Aufruf von DBMS_RULE.EVALUATE angestoßen. Zurückgegeben werden die Rules, die mit TRUE bewertet wurden und die so genannten Maybe Rules.

Auf das Thema Maybe Rules kann hier aber nicht weiter eingegangen werden. Informationen hierzu finden Sie in der Dokumentation "Oracle Streams Concepts und Administration" [1]. Anschließend werden die zurückgegebenen Regeln und die zugehörigen Aktionen ausgewertet und ausgegeben.

Data Dictionary

Aus den folgenden Views des Data Dictionary können Informationen zu den erstellten Objekten abgefragt werden:

Fazit

Das vorgestellte Beispiel ist nur ein einfaches Beispiel zur Benutzung von expliziten Variablen. Darüber hinausgehende Möglichkeiten werden aus Platzgründen nicht vorgestellt. Auch hier sei nochmal auf die Dokumentation verwiesen. Für die Administration der Rules, Rule Sets und Evaluation Contexts gibt es eine ausgeprägte Rechtestruktur, auf die hiermit nur hingewiesen wird.

Beate Künneke (info@ordix.de).