2012-10-25 18 views
5

Non ho molta familiarità con iseries/DB2. Tuttavia, lavoro su un sito Web che lo utilizza come database principale.Perché ottengo un'eccezione "[SQL0802] Conversione dei dati dell'errore di mappatura dei dati"?

Una nuova colonna è stata recentemente aggiunta a una tabella esistente. Quando ho vista tramite AS400, vedo il seguente tipo di dati:

Type: S 
Length: 9 
Dec: 2 

Questo mi dice che è un campo numerico a 6 cifre prima della virgola e 2 cifre dopo la virgola.

Quando interrogo i dati con un semplice SELECT (SELECT MYCOL FROM MYTABLE), ottengo indietro tutti i record senza problemi. Tuttavia, quando provo con un DISTINCT, GROUP BY o ORDER BY su quella stessa colonna ottengo la seguente eccezione:

[SQL0802] Data conversion of data mapping error 

ho dedotto che almeno un record ha dati non validi - quello che i miei chiamate DBA "spazi vuoti" o "4 O". Come è possibile questo però? Il database non dovrebbe generare un'eccezione quando si tenta di aggiungere dati non validi a quella colonna?

C'è un modo per aggirare questo problema, come filtrare quei record non validi nella mia query?

+4

Una colonna numerica zonata (9,2) avrebbe 7 cifre a sinistra del punto decimale (ad esempio 9 meno 2) – WarrenT

+0

Qual è il codice del tipo di errore visualizzato nel testo di secondo livello del messaggio SQL0802? – WarrenT

+0

@WarrenT "SQLSTATE 22023" –

risposta

2

L'unica soluzione che ho trovato era scrivere uno script che verifica i valori vuoti nella colonna e li aggiorna a zero quando vengono trovati.

4

"4 O" significa 0x40, che è il codice EBCDIC per uno spazio o un carattere vuoto ed è il valore predefinito inserito in qualsiasi nuovo spazio in un record.

I programmi/operazioni precedenti possono introdurre l'errore dei dati decimali. Ad esempio se il nuovo file è stato creato e compilato utilizzando il comando CPYF con l'opzione FMTOPT(*NOCHK).

Il modo più semplice per risolverlo è scrivere un programma HLL (RPG) per leggere il file e correggere i record.

2

Se il controllo del livello di formato del record è disattivato [es. LVLCHK(*NO)] o viene sovrascritto, quindi un programma HLL. (ad esempio RPG, COBOL, ecc.) che non è stato ricompilato con il nuovo record potrebbe scrivere i record con dati non validi in questa colonna, specialmente se la nuova colonna non si trova alla fine del record.

Assicurarsi che tutti i programmi che utilizzano l'I/O nativo per scrivere o aggiornare i record su questo file vengano ricompilati.

+0

Come ha detto James, un programma HLL potrebbe essere il modo più semplice per correggere i record attualmente in errore.Ma per evitare errori ricorrenti, è necessario ricompilare i programmi che scrivono o aggiornano i record nel file fisico o logici su di esso. – WarrenT

0

Sono stato in grado di risolvere questo errore forzando la conversione delle colonne chiave in intero. Ho cambiato il join da questo ...

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

... per questo ...

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

... e non ho dovuto apportare qualche correzione ai tavoli. Questo è un database molto vecchio, molto disordinato con un sacco di spazzatura in esso. Ho apportato molte correzioni, ma è un lavoro in corso.