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;