Transfer von Daten aus Oracle mittels SSIS

Zumeist ist die Extraktion von Daten aus diversen Quellen mit SSIS recht problemlos, allerdings nicht wenn Daten aus Oracle transferiert werden sollen. Ich musste schmerzlich feststellen, dass die Unterstützung dafür in SSIS (beim Kunden ist aktuelle SQL Server 2012 im Einsatz) nicht optimal ist.

Der standardmäßig vorhandene OLE DB-Provider Microsoft OLE DB-Provider for Oracle erfordert die Installation der Oracle Client Komponenten. Hierbei ist darauf zu achten, dass man bei Verwendung der 32bit Komponente bei der Ausführung des SSIS Pakets in der Entwicklungsumgebung von Visual Studio entsprechend auch den 32bit-Modus aktiviert (Run64BitRunTime = False, Project Properties > Debugging), da man ansonsten den Fehler „The AcquireConnection method call to the conenction Manager failed with error codee 0x80004005“ erhält. Für die spätere Ausführung des SSIS Pakets via SQL Agent ist jedenfalls die 64bit Variante erforderlich.

Ist der Zugriff geschafft, dauert es sehr lange bis alle Objekte in der Data Source eines Data Transfer Tasks aufgelistet sind. Nicht nur deshalb ist die Empfehlung stattdessen mit einer SQL Query zu arbeiten.

Sobald man die verfügbaren Spalten der Data Source öffnet, erhält man eine Fehlermeldung betreffend der DefaultCodePage: „Cannot retrieve the column code page info from the OLE DB provider“. Als Lösung muss in den Properties der Data Source AllowUseDefaultCodePage = True gesetzt werden.

Bei der Erstellung der Tabellen in der OLE DB Destination werden die Datentypen nicht korrekt übersetzt. Dies manuell richtig zu stellen ist möglich (siehe hier und hier), aber vergleichsweise aufwendig. Versuche mit den ADO.NET Providern lieferten ein ähnlich schlechtes Ergebnis.

Abhilfe schafft der bei Microsoft hier erhältlicher Provider von Attunity. Dieser erkennt und übersetzt die Datentypen korrekt, allerdings gibt es auch hier Abstriche. Zum Einen dürfte es eine Längenbeschränkung der SQL Query geben, jedenfalls erhielt ich bei einer Query mit ca. 900 Zeichen einen Fehler. Zum Anderen ist es nicht möglich out-of-the box die SQL Query aus einer Variable zu verwenden. Dazu muss man den hier beschriebenen Workaround wählen.

Acht geben muss man auch bei Datumsfelder, welche in Oracle Werte annehmen können, die im SQL Server nicht möglich sind. So fand ich zum Beispiel Datumseinträge für das Jahr 0214 (also ein Typo von 2014) was der SQL Server aber als ungültiges Datum klassifiziert. Um herauszufinden, welche Records den Fehler kann man beispielsweise den Error Output wie hier beschrieben verwenden.

Noch eine positive Anmerkung zum Schluss: wenn die Unwegsamkeiten erst einmal überwunden sind, ist die Geschwindigkeit der Extraktion recht gut.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s