Unload und Load von LOBs

Mit der Bereitstellung des neuen Datentypen LOB, genauer gesagt von CLOB, BLOB und DBLOB ist die IBM zwar dem Wunsch vieler Kunden nachgekommen, die entsprechend grosse Objekte in der Datenbank ablegen wollten. Andererseits wurde jedoch eine neue "Baustelle aufgemacht". Wie können diese Objekte von einer Tabelle in eine andere übertragen werden oder von einem produktiven DB2-System in ein Testsystem oder umgekehrt. Die Standard-Verfahren wie DSNTIAUL zum Entladen und das LOAD-Utility zum Laden sind auf eine Gesamtlänge von 32kB für den Ladebestand beschränkt. LOBs, die ja bis zu 2 GB gross werden können, können damit nicht mehr verarbeitet werden. IBM musste daher eine andere Möglichkeit der Übertragung schaffen. Sie verwendeten hierzu das gleiche Prinzip wie für die Speicherung der LOBs. Diese werden auch nicht in der ursprünglichen Tabelle gespeichert, sondern in einem separaten Tablespace und bekommen in der Basistabelle nur einen Verweis ( ROWID ). Genauso wird es auch im Ladebestand gehandhabt. Der LOB-Wert wird in einem separaten File gespeichert und im Ladebestand findet sich nur noch ein Verweis auf diese Datei.

Um dies zu bewerkstelligen muss im UNLOAD-Utility zuerst mittels TEMPLATE eine Dateidefinition vorgegeben werden, auf diese wird sich anschliessend im UNLOAD bezogen.

Diese Datei muss vom Typ PDS sein. Jeder LOB wird in einem eigenen Member dieser Bibliothek gespeichert, wobei das UNLOAD-Utility einen entsprechenden eindeutigen Membernamen pro entladener Zeile generiert. Im (Ent-)Ladebestand wird an der entsprechenden Stelle nur noch auf dieses Member verwiesen. DB2 vergibt für die Bibliothek die Dateiattribute LRECL=27994,BLKSIZE=27998,RECFM=V

Im UNLOAD-Utility sehen die Kontrollstatements dann wie folgt aus:

TEMPLATE lobpds DSN 'name1.name2.&ts.' DSNTYPE(PDS) UNIT(SYSDA)

UNLOAD DATA
FROM TABLE creator.name
(
spalte1 type1 ,
spalte2 type2 ,
CLOBSPALTE1 VARCHAR(nnn) CLOBF lobpds ,
CLOBSPALTE2 VARCHAR(nnn) CLOBF lobpds ,
spalte3 type3 ...
)


Der TEMPLATE-Name lobpds ist natürlich frei wählbar.
Wird im Template das Symbol &TS. verwendet, dann wird der Name des LOB-Tablespaces eingesetzt, so dass für unterschiedliche CLOBS das gleiche Template verwendet werden kann.

VARCHAR(nnn) muss lange genug sein, um den generierten Dateinamen inklusive Membernamen aufzunehmen. ( Statt VARCHAR(nnn) kann auch CHAR(nnn) in entsprechender Länge verwendet werden )

Das UNLOAD-Utility generiert nun in der SYSPUNCH-Datei die folgenden Ladekontrollstatements:

LOAD DATA […]
INTO TABLE creator.name
(
spalte1 POSITION(von:bis) type1 NULLIF(position)=X'FF' ,
spalte2 POSITION (von:bis) type2 NULLIF(position)=X'FF' ,
CLOBSPALTE1 POSITION(von:bis) VARCHAR CLOBF NULLIF(position)=X'FF' ,
CLOBSPALTE1 POSITION(von:bis) VARCHAR CLOBF NULLIF(position)=X'FF' ,
spalte3 POSITION (von:bis) type3 NULLIF(position)=X'FF' ,

)


( Hinweis: NULLIF() entfällt natürlich , wenn die Spalte NOT NULL ist )

und in der SYSREC-Datei steht im (UN-)LOAD-Bestand an der entsprechenden Stelle:

**************************************** START OF DATA ********************************************************
.testrow1col1 .testrow1col2 ...name1.name2.lobspace1(BJ5Z2C3W) ...name1.name2.lobspace2(BJ5Z2C3W) .testrow1col3
.testrow2col1 .testrow2col2 ...name1.name2.lobspace1(BJ5Z2DKK) ...name1.name2.lobspace2(BJ5Z2DKK) .testrow2col3
.testrow3col1 .testrow3col2 ...name1.name2.lobspace1(BJ5Z2DVW) ...name1.name2.lobspace2(BJ5Z2DVW) .testrow3col3
***************************************** END OF DATA *********************************************************

( Der Punkt vor jedem Wert symbolisiert hier das NULL-Kennzeichen X'00' / X'FF' bzw. die zwei Bytes Längenschlüssel (hier X'001F' = 31 ) aufgrund des VARCHAR-Types. Diese zwei Bytes entfallen natürlich bei Verwendung von CHAR(nnn) anstelle von VARCHAR(nnn) )

Der generierte Membername ist für alle LOBs einer Zeile gleich. Sollen deshalb mehr als eine LOB-Spalte entladen werden, so müssen unterschiedliche Bibliotheken verwendet werden, entweder durch Verwendung unterschiedlicher TEMPLATEs oder durch Verwendung von &TS. innerhalb des Templates, wodurch unterschiedliche Namen generiert werden. Geschieht dies nicht, wird immer die gleiche Bibliothek verwendet und das Member immer wieder überschrieben. Das UNLOAD-Utility endet in diesem Fall allerdings trotzdem mit RC=0.

Beim Laden wird nun aufgrund der CLOBF Angabe in der Ladekontrollkarte der LOB-Wert im Member der entsprechenden Bibliothek gesucht und von dort geladen.

Ein Entladen von Imagecopy ist bei Angabe von CLOBF nicht möglich.
Analog zu CLOBF gibt es auch die Angaben BLOBF und DBLOBF für BLOBs und DBLOBs. Hier findet ( im Gegensatz zu CLOBF ) beim UNLOAD keine Anpassung aufgrund der CCSIDs statt. Allerdings ist auch hier ein UNLOAD FROM COPY nicht möglich.


Zurück zu DB2 Home Impressum / Datenschutz