Aufbau eines dynamischen ETL Frameworks auf Basis eines PL/SQL Codegenerators München, 21. Nowember 2007 Nicola Marangoni & Jörg Westermayer Nicola.Marangoni@SHS-VIVEON.com Joerg.Westermayer@SHS-VIVEON.com
Inhalt 01 Einleitung - Typischer Ist-Stand - Lösungsvorschlag 02 Metadaten - Verwaltung - Abhängigkeiten 03 Code Generator - Templates und Parameter - Ersetzung der Parameter - Codegenerierung 04 Remote Deployement - Ausführung von DDLs über DB Links - Übertragung der DDLs 05 Table Functions 21. Nowember 2007 Seite 2
01 EINLEITUNG
Typischer Ist-Stand Häufige ETL Architektur - Extraktion, Aggregation zusammen mit der Berechnung der Merkmalen - Ableitung von komplexen Merkmalen hardkodiert im ETL - Aufbau von komplexen Regelwerken direkt im Code (PL/SQL) oder Mappings - Unstrukturierte Regelwerke (keine direkte Referenz zu Scorecards und Segmentierungen) - Monolitische Struktur Interaktion mit dem Business User - Der Business User ist komplett vom Programmierer Abhängig - Schwierige Übersetzung von Business Definitionen in Code - Wenig strukturierte Zusammenarbeit 21. Nowember 2007 Seite 4
Lösungsvorschlag Trennung von ETL und Berechnung - Klassischem ETL Extraktion Aggregation - Berechnung von komplexen Merkmalen Berechnung von KPIs Business Regeln Quelle 1 Quelle 2 Quelle 3 Extraktion Aggregation Quelle n Steuerung über Metadaten - Definition der Merkmalen - Definition der Abhängigkeiten Standard ETL Metadaten gesteuert Input Berechnung Output 21. Nowember 2007 Seite 5
02 METADATEN
Abhängigkeiten Komplexe Bäume - Parent-Child Beziehungen - Beliebig tiefe Verschachtelung - Überprüfung von Schleifen Input 1 Input 2 Input 3 Input 4 Output 1 Output 2 Output 3 Output 4 Output 5 Output 6 Output 7 Output 8 21. Nowember 2007 Seite 7
Verwaltung Applikation Graphische Applikation - Komplette Pflege über Masken Maske Maske Maske Business Orientiert - Verwendung von Business Begriffe Benutzerfreundlich - Einfache und intuitive Navigation Metadaten 21. Nowember 2007 Seite 8
03 CODE GENERATOR
Codegenerierung Architektur - Die Parameter nehmen Werte, die aus den Metadaten stammen Metadaten Generierte DDLs Code Generator CREATE OR REPLACE PACKAGE pkg_load CREATE OR REPLACE VIEW v_input_vars AS SELECT Code Code Code ; Templates <p_param_1> <p_param_2> <p_param_n> <p_param_1> <p_param_2> <p_param_n> Code Code Code END pkg_load; 21. Nowember 2007 Seite 10
Templates View Enthalten in PL/SQL Variablen - Generische DDLs - Code Teile c_tmpl_generic_view := CREATE OR REPLACE VIEW <p_view_name> AS SELECT <p_column_list> FROM <p_source_name>; ; Loop c_tmpl_var_loop := FOR rec_vars IN ( SELECT FROM ) LOOP <p_init_stmt> Prozedur c_tmpl_generic_proc := PROCEDURE <p_procedure_name> IS <p_variable_declarations> BEGIN -- Insert statement INSERT INTO <p_target> SELECT <p_column_list> FROM <p_source>; EXCEPTION WHEN OTHERS THEN <p_exception code> END <p_procedure_name>; ; <p_var_name> := <p_var_expression>; <p_log_stmt> END LOOP; ; 21. Nowember 2007 Seite 11
Ersetzung der Parameter Ersetzung der Parameter - Reine Textverarbeitung - Parameter werden durch Code Teile ersetzt - Parameter werden durch Objektnamen ersetzt c_tmpl_generic_view := CREATE OR REPLACE VIEW <p_view_name> AS SELECT <p_column_list> FROM <p_source_name>; ; v_view_name := V_REVENUE_TOT ; v_column_list := SUM (revenue) AS revenue_tot ; v_source_name := T_REVENUE_DETAIL ; CREATE OR REPLACE VIEW V_REVENUE_TOT AS SELECT SUM (revenue) AS revenue_tot FROM T_REVENUE_DETAIL; 21. Nowember 2007 Seite 12
Ersetzung der Parameter Komplexe Verschachtelung von Templates und Codebestandteilen Generierender Code Templates -- Prepare variables for loop code v_procedure_core := c_loop_month;. v_insert_stmt := INSERT INTO T_REVENUE_TOT (revenue) VALUES (v_revenue) ; -- Build loop coode code_replace(v_procedure_core, p_insert_stmt,v_insert_stmt); -- Prepare variables for main procedure v_procedure := c_templ_generic_proc; -- Prepare variables for main procedure v_procedure_name := PRC_EXTRACT ; v_variable_declarations := v_buffer INTEGER; v_rev INTEGER; ; v_exception code := log( Error! ); ; -- Set main procedure properties code_replace(v_procedure, p_procedure_name,v_procedure_name); code_replace(v_procedure, p_variable_declarations,v_variable_declarations); code_replace(v_procedure, p_exception code,v_exception code); -- Add loop to procedure code_replace(v_procedure, p_procedure_core,v_procedure_core); c_loop_month := FOR rec_months IN ( SELECT fiscal_month FROM t_calendar ) LOOP SELECT SUM (revenue) INTO v_revenue FROM T_REVENUE WHERE fiscal_month = rec_months.fiscal_month; v_buffer := v_buffer + v_revenue; <p_insert_stmt>; END LOOP; ; c_tmpl_generic_proc := PROCEDURE <p_procedure_name> IS <p_variable_declarations> BEGIN -- Loop <p_procedure_core> EXCEPTION WHEN OTHERS THEN <p_exception code> END <p_procedure_name>; ; 21. Nowember 2007 Seite 13
Ersetzung der Parameter Beispiel: Ergebnis - Durch den Ersatz der Parameter mit Codebestandteile und Objektamen ist der DDL Code komplett PROCEDURE PRC_STORE_SUMS IS v_buffer INTEGER; v_revenue INTEGER BEGIN -- Procedure core FOR rec_month IN ( SELECT fiscal_month FROM t_calendar ) LOOP SELECT SUM (revenue) INTO v_revenue FROM T_REVENUE WHERE fiscal_month = rec_month.fiscal_month; v_buffer := v_buffer + v_revenue; INSERT INTO T_REVENUE_TOT (revenue) VALUES (v_buffer); END LOOP; EXCEPTION WHEN OTHERS THEN log( Error! ); END PRC_STORE_SUMS; 21. Nowember 2007 Seite 14
04 REMOTE DEPLOYEMENT
Ausführung von DDLs über DB Links Trennung von Generator und Objekte - Generierte Objekte unabhängig vom Framework - Die Target Datenbank kann auch ncht mehr erreichbar sein Framework Code Generato r Target Database DDL Reposito ry Objekte In ETL Out 21. Nowember 2007 Seite 16
Übertragung der DDLs - Die DDLs werden als CLOBs generiert - CLOBs können nicht über DB-Links übertragen werden. - Einteilung in kleinere Codeteile - maximale Größe eines VARCHAR2-Feldes - In der Target-Datenbank in einer Tabelle abgelegt - Zusammenfassung und Ausführung der DDLs. Framework Target Database Token 1 Token 1 CLOB DDL CLOB DDL Token n Token n DDL Repository 21. Nowember 2007 Seite 17
04 TABLE FUNCTIONS
Berechnung von komplexen Ausdrücken Das Input ist der Argument der Funktion Loop für jede Zeile Output Dataset als Return Wert Table Function Input Argument Return Output Loop for each record 21. Nowember 2007 Seite 19
HERZLICHEN DANK FÜR EURE AUFMERKSAMKEIT!!! Nicola Marangoni & Jörg Westermayer Nicola.Marangoni@SHS-VIVEON.com Joerg.Westermayer@SHS-VIVEON.com