oracle-consulting.de

Der Grundstein für den Erfolg eines Data Warehouses wird bereits beim Design gelegt!

Durch konsequente Einhaltung von Codestandards und optimalen Design kann auf Loadspitzen und sich ändernde Anforderungen flexible reagiert werden - oft ohne zusätzliche Hardwareresourcen.

Der Ladeprozess

Zum Laden von Daten im Allgemeinen der SQL-Loader von Oracle verwendet, der sich durch Flelixibilität und einfache Handhabung auszeichnet. Ein wesentlicher Vorteil des Loaders ist es, das Daten über sql/net geladen werden können. Eine höhere Ladeperformance und Integration in den Transformationsprozess ereicht man durch die verwendung von externen Tabellen. Der Loader kann aus dem ctl-Script das ddl der externen Tabelle erstellen. Die so erstellten externen Tabellen können im darauf folgenden Transformationsprozess wie 'normale' Oracle Tabellen in select - Statements genutzt werden.

SQL / PL/SQL
sqlldr
  user_id/password
  control=control.ctl
  log=table_load.log
  external_table=generate_only

Der Transformationsprozess

Hier gibt Oracle eine Vielzahl von Möglichkeiten, bei komplexeren Transformationen sollten Table Functions genutzt werden. So kann die Transformation der Daten aus der externen Tabelle 'some_talbe' über die Funktion my_table_function erfolgen. Das Ergebnis des folgende Views wird dann einfach der DB hinzu gefügt.

SQL / PL/SQL
select * from
  table (
        my_table_function(
                       CURSOR(select
                                 field1, field2, field3
                                FROM
                                 some_table
                              )
                         )
        );

Update Statements sollten grundsätzlich als 'bulk-update' codiert werden. Im ersten Schritt wird der Update-View definiert:

SQL / PL/SQL
create view v_upd_table as
 select a.rowid z_rowid, b.new_value
  from
 table_target a, table_source b
 where
  a.pk_column = b.pk_column;

Dieser View wird anschließend in einem Package verwendet, wobei grundsätzlich bulk-update mit 'limit' verwendet werden soll.

SQL / PL/SQL
declare
     type t_rowid is table of varchar2(18) index by pls_integer;
     type t_new_value is table of v_upd_table.new_value%type index by pls_integer;

     l_t_rowid t_rowid;
     l_t_new_value t_new_value;

     cursor c_upd is
       select * from v_upd_table;

     fetch_limit constant number := 10000;

begin
   open c_upd;

   loop
     fetch c_upd bulk collect
        into l_t_rowid, l_t_new_value
        limit fetch_limit ;

     pkg_common_logging.fetched(c_upd%ROWCOUNT);

   if c_upd%ROWCOUNT > 0 THEN
        forall i in l_t_rowid.first .. l_t_rowid.last

      update table_target set
         old_value = l_t_new_value(i)
         WHERE ROWID = CHARTOROWID (l_t_rowid(i));

      commit;

    end if;
   exit when l_t_rowid.count() < fetch_limit;

   end loop;
   close c_upd;

exception
  when others then
    pkg_common_logging.failed;
    close c_upd;
    raise;

end;