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.
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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 ; |