Für ein Projekt kam jetzt die Anforderung auf, dynamisch Regeln auszuwerten. Im Idealfall sieht das dann so aus. Man hat z.B. folgende Tabelle:
CREATE TABLE logik(
FELD1 NUMBER,
FELD2 NUMBER,
FORMULA VARCHAR2(100)
)
In Spalte FELD1 und FELD2 steht jeweils ein Wert und in der Spalte Formel befindet sich die Berechnung (z.B. FELD1/FELD2 * 100 um den Prozentsatz des Verhältnisses zu bestimmen). Beim Beladen möchte man nun optimalerweise die Formel gleich anwenden, also dynamisch auswerten. Obwohl man mit Informatica PowerCenter durchaus komplexe Transformationen durchführen kann, fehlt die Funktionalität solche Ausdrücke zur Laufzeit auswerten zu können.
Der Workaround besteht darin, eine StoredProcedure Transformation einzubauen (in Informatica 8 sollte auch eine SQL-Transformation existieren, mit der man das auch erreichen kann) , die in der Datenbank eine Stored Procedure ablegt, die das dynamisch auswertet.
Bsp (für Oracle):
CREATE OR REPLACE FUNCTION calc (formula VARCHAR2) RETURN REAL IS
sql_stmt VARCHAR2(100);
v_result REAL;
BEGIN
sql_stmt := 'SELECT ' || formula || ' from dual';
EXECUTE IMMEDIATE sql_stmt INTO v_result;
RETURN v_result;
EXCEPTION
WHEN OTHERS THEN RAISE;
END calc;
CODE:SQL> select 7*10/2 from dual; 7*10/2 ------ 35
Theoretisch kann man so jegliche SQL-Ausdrücke auswerten lassen, dazu muß der Rückgabewert bei Bedarf noch auf Varchar geändert werden.
In Informatica kann die Prozedur dann so eingebunden werden:
Übersicht über das Mapping Design:
In der Expression Transformation (rot), werden die String-Variablen FELD1 und FELD2 im Feld FORMULA durch ihren Inhalt ersetzt. Diese aufgelöste Formel, wird danach an die Stored Procedure CALC übergeben (unconnected)
