2012-10-25 14 views
5

Ich bin nicht sehr vertraut mit iseries/DB2. Ich arbeite jedoch auf einer Website, die es als primäre Datenbank verwendet.Warum erhalte ich eine Ausnahme "[SQL0802] Datenkonvertierung von Datenzuordnungsfehler"?

Eine neue Säule wurde zu einer vorhandenen Tabelle kürzlich hinzugefügt. Wenn ich es über AS400 sehen, sehe ich den folgenden Datentyp:

Type: S 
Length: 9 
Dec: 2 

Das sagt mir, es ist ein numerisches Feld mit 6 Stellen vor dem Komma und 2 Stellen nach dem Komma.

Wenn ich abfragen, die Daten mit einem einfachen SELECT (SELECT MYCOL FROM MYTABLE), bekomme ich ohne Probleme alle Datensätze zurück. Allerdings, wenn ich versuchen, eine DISTINCT verwenden, GROUP BY oder ORDER BY auf derselben Spalte ich die folgende Ausnahme erhalten:

[SQL0802] Data conversion of data mapping error 

Ich habe gefolgert, dass mindestens ein Datensatz ungültige Daten hat - was meine DBA Anrufe „blanks“ oder "4 O". Wie ist das möglich? Sollte die Datenbank keine Ausnahme auslösen, wenn versucht wird, ungültige Daten zu dieser Spalte hinzuzufügen?

Gibt es eine Möglichkeit, um diesen, wie Ausfiltern diese schlechten Aufzeichnungen in meiner Anfrage zu bekommen?

+4

Eine zonierte numerische (9,2) Spalte hätte sieben Stellen vor dem Dezimalpunkt (dh 9 minus 2) – WarrenT

+0

Was ist der Fehlertypcode, der im Text der zweiten Ebene Ihrer SQL0802-Nachricht angezeigt wird? – WarrenT

+0

@WarrenT "SQLSTATE 22023" –

Antwort

2

Die einzige Lösung, die ich finden konnte, war ein Skript zu schreiben, die für leere Werte in der Spalte überprüft und aktualisiert sie auf Null, wenn sie gefunden werden.

4

"4 O" bedeutet 0x40, das ist der EBCDIC-Code für ein Leerzeichen oder Leerzeichen und ist der Standardwert, der in einem beliebigen neuen Speicherplatz in einem Datensatz platziert wird.

Legacy-Programme/Operationen können das Dezimalsystem Datenfehler einführen. Zum Beispiel, wenn die neue Datei erstellt und mit dem Befehl CPYF mit der Option FMTOPT(*NOCHK) gefüllt wurde.

Der einfachste Weg, um es zu beheben ist ein HLL-Programm (RPG) zu schreiben, die Datei und korrigieren Sie die Aufzeichnungen zu lesen.

2

Wenn die Dateiformatprüfung für Datensatzformat deaktiviert ist [d. LVLCHK(*NO)] oder wird überschrieben, dann ein HLL-Programm. (z. B. RPG, COBOL usw.), die nicht mit dem neuen Datensatz neu kompiliert wurden, schreibt möglicherweise Datensätze mit ungültigen Daten in diese Spalte, insbesondere wenn die neue Spalte nicht am Ende des Datensatzes steht.

Stellen Sie sicher, dass alle Programme, die native E/A verwenden, um Datensätze für diese Datei zu schreiben oder zu aktualisieren, neu kompiliert werden.

+0

Wie James sagte, ein HLL-Programm kann der einfachste Weg sein, Datensätze zu korrigieren, die derzeit fehlerhaft sind.Um wiederkehrende Fehler zu vermeiden, müssen Sie jedoch Programme neu kompilieren, die Datensätze in die physische Datei schreiben oder aktualisieren oder logisch darüber. – WarrenT

0

Ich konnte diesen Fehler lösen, indem ich die Schlüsselspalten zwangsweise auf Integer umwandelte. Ich änderte die von diesem beitreten ...

FROM DAILYV INNER JOIN BXV ON DAILYV.DAITEM=BXV.BXPACK 

... dazu ...

FROM DAILYV INNER JOIN BXV ON CAST(DAILYV.DAITEM AS INT)=CAST(BXV.BXPACK AS INT) 

... und ich habe keine Korrekturen an den Tischen zu machen. Dies ist eine sehr alte, sehr unordentliche Datenbank mit viel Müll darin. Ich habe viele Korrekturen vorgenommen, aber es ist ein work in progress.