Durch konsequente Einhaltung von Codestandards und optimalen Design kann auf Loadspitzen und sich ändernde Anforderungen flexible reagiert werden - oft ohne zusätzliche Hardwareresourcen.
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.
sqlldr user_id/password control=control.ctl log=table_load.log external_table=generate_only
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.
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:
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.
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;