1. SAS Connect to DB2 Fehler: Ausgangslage
Beim Beladen einer DB2 Datenbank über SAS Connect to DB2 mittels "Bulk Load" trat immer wieder das Problem auf, dass Zeilen nicht in die Datenbank geschrieben (rejected) worden sind.
Code:
PROC SQL;
DROP TABLE DB2LIB.TABLE;
QUIT;
data DB2LIB.TABLE (BULKLOAD=YES BL_METHOD=CLILOAD BL_OPTIONS="ANYORDER"
DBCOMMIT=50000
);
set TABLE;
run;
2. SAS Connect to DB2 Fehler: Fehleranalyse SQL1194W
Die Rückmeldung der DB2 aus dem SAS-Log war zunächst wenig aussagekräftig bzw. hilfreich:
NOTE: The data set DB2LIB.TABLE has 75736151 observations and 58 variables.
WARNING: [IBM][CLI Driver][DB2/AIX64] SQL3107W At least one warning message was encountered during LOAD processing.
Results for CLI LOAD operation:
75713455 rows loaded.
0 rows skipped.
22696 rows rejected.
0 rows deleted as duplicates.
75713455 rows committed.
Das hinzufügen der Bulkload Option „BL_LOG=“ erstellt ein Log mit mehr Informationen zum Bulkload in die DB2-Datenbank
BL_LOG="e:\TABLE_DB2_Bulkload.log"
Das geschriebene Log enthält für jeden Satz der von der DB2 abgelehnt wurde die folgende Fehlermeldung:
SQL1194W The value in row "F10-13763" corresponding to target column number
"53" is not valid. The row has been rejected
Das Problem lag also in Spalte Nummer 53 der SAS-Tabelle, die in die DB2 geschrieben wurde.
Die Analyse der Spalte zeigte, dass diese eine alphanumerische Spalte der Länge $50 war. Nach Ansicht der Inhalte der Spalte (über Proc Freq) wurde klar, dass der längste Text tatsächlich 50 Zeichen lang war und Umlaute (in diesem Fall ein „ü“) enthielt.
3. SAS Connect to DB2 Fehler: Lösung des Problems SQL1194W
Der Kern des Problems war, dass in SAS eine Länge von 50 ausreichend war um den Inhalt der Spalte korrekt abzubilden. In der DB2 wurde aber durch den Umlaut eine größere breite als Varchar(50) benötigt.
Das Hochsetzen der Breite in einer Length-Anweisung für die Spalte auf $60 hat das Problem schließlich behoben und dazu geführt, dass keine Sätze mehr von der DB2-Datenbank abgelehnt worden sind.
Results for CLI LOAD operation:
75736151 rows loaded.
0 rows skipped.
0 rows rejected.
0 rows deleted as duplicates.
75736151 rows committed.