
| 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. |
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.
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.
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.
Der Prozess der Evaluierung wird wie folgt durchlaufen:
![]() |
| Abb. 1: Rule Evaluation Context. |
Abbildung 1 illustriert diese Vorgehensweise.
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. |
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. |
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. |
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. |
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.
Aus den folgenden Views des Data Dictionary können Informationen zu den erstellten Objekten abgefragt werden:
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).