Zentraler Zugriffslayer - ein standardisiertes Reportinginterface


Die Weitergabe von Daten an andere Systeme und die Erstellung von Reports kann über ein Standardtool abgebildet werden. Über das standadisierte Reportinginterface erfolgt die Abkopplung der Datenbankzugriffe der Nutzer vom eigentlichen Data Warehouse Schema.


Überblick

Das Ziel eines standadisierten Zugriffslayers ist die Entkopplung der Datenbereitstellung für Consumer von den eigentlichen Datenstrukturen des Data Warehouses. Duch die Nutzung von Table Functions kombiniert man maximale Flexibilität mit maximaler Performance. Die Zugriffsschicht ist somit unabhängig von Strukturänderungen des Warehouse-Schemas.

Die Konfiguration und Definition der Reports wird in einem Metadaten-Repository gehalten. Die Tablesfunction stellt die auszuliefernden Daten anhand dieser Definition bereit und kann von der Zugriffsschicht über ein Standard-SQL select Statement abgefragt werden. Dabei benötigt der zugreifende User nur select-Rechte auf dual. Somit sind die Rechte auf ein absolutes Minimum reduziert.

Metadaten zur Konfiguration

Die Konfiguration der Reports / Abfragen erfolgt über 2 Tabellen. In der Master-Tabelle werden die grundlegenden Information über den zugrunde liegenden Datenbestand gehalten, dieser wird über einen View bzw eine Tabelle definiert.

CREATE TABLE rpt_master
 (  rep_id VARCHAR2 (10), 
    name VARCHAR2 (100), 
    date_format VARCHAR2 (20), 
    number_format VARCHAR2 (2),
    filename VARCHAR2 (50), 
    deliminator VARCHAR2 (5), 
    table_name VARCHAR2 (50), 
    where_cond VARCHAR2 (500), 
    filename_date VARCHAR2 (20) 
)
/

In der zweiten Tabelle werden die anzuzeigenden Spaltennamen definiert.

CREATE TABLE RPT_FIELDS
(   rep_id VARCHAR2(10),
    header_text VARCHAR2(50),
    orderby NUMBER,
    column_name VARCHAR2(50)
 )
/

Die Table Function

Die Reports werden über die Procedure pk_file_exp erstellt, die sowohl über utl_file Files erstellen kann als auch Daten über sqlplus mit einer Table Function ausgeben kann.

CREATE OR REPLACE PACKAGE Pkg_File_Exp
IS

   TYPE refcur_t IS REF CURSOR RETURN dual%ROWTYPE;
   
   -- für die Ausgabe über utl-file
   PROCEDURE process (
           p_report rpt_master.rep_id%type
           );
           
   -- für die Ausgabe über sql        
   FUNCTION tf_process(
           p Pkg_File_Exp.refcur_t, 
           v_rep_id in rpt_master.rep_id%type )
        RETURN T_file_exp_set PIPELINED;
        
end Pkg_File_Exp;
/

Die Ausgabe der Daten

Die Ausgabe der Daten kann sowohl in Form von Datendateien (Beispiel csv) oder als simples select-Statment in einer Oracle-Session erfolgen. Ein bedeutender Vorteil dieses Vorgehens ist es, dass der ausführende User nur ein execute-Privileg auf das Package pk_file_exp benötigt, nicht jedoch ein select-Recht auf den Datenview.

	begin
  pk_file_exp.process('MY_REP_ID');
end;  

Für die Ausgabe über sql kann das select - Statement wie folgt aussehen.

select * from 
   table (pk_file_exp.tf_process(CURSOR(select * from dual ,'rep_id')));