2012-10-25 69 views
5

Tôi không quen thuộc với các thư viện/DB2. Tuy nhiên, tôi làm việc trên một trang web sử dụng nó làm cơ sở dữ liệu chính của nó.Tại sao tôi nhận được "[SQL0802] Chuyển đổi dữ liệu của lỗi ánh xạ dữ liệu" ngoại lệ?

Một cột mới gần đây đã được thêm vào bảng hiện có. Khi tôi xem thông qua AS400, tôi thấy loại dữ liệu sau:

Type: S 
Length: 9 
Dec: 2 

Điều này cho tôi biết đây là trường số có 6 chữ số trước dấu thập phân và 2 chữ số sau dấu thập phân.

Khi tôi truy vấn dữ liệu bằng SELECT đơn giản (SELECT MYCOL FROM MYTABLE), tôi lấy lại tất cả các bản ghi mà không gặp sự cố. Tuy nhiên, khi tôi cố gắng sử dụng một DISTINCT, GROUP BY, hoặc ORDER BY trên cùng cột tôi nhận được ngoại lệ sau đây:

[SQL0802] Data conversion of data mapping error 

Tôi đã suy luận rằng ít nhất một bản ghi có dữ liệu không hợp lệ - những gì DBA cuộc gọi của tôi "khoảng trống" hoặc "4 O". Làm thế nào là điều này có thể mặc dù? Cơ sở dữ liệu có nên ném một ngoại lệ khi dữ liệu không hợp lệ được cố gắng thêm vào cột đó không?

Có cách nào để giải quyết vấn đề này, chẳng hạn như lọc ra những bản ghi xấu trong truy vấn của tôi không?

+4

Cột số phân vùng (9,2) sẽ có 7 chữ số ở bên trái dấu thập phân (ví dụ: 9 trừ 2) – WarrenT

+0

Mã loại lỗi được hiển thị trong văn bản cấp thứ hai của thông điệp SQL0802 của bạn là gì? – WarrenT

+0

@WarrenT "SQLSTATE 22023" –

Trả lời

2

Giải pháp duy nhất tôi có thể tìm là viết một tập lệnh để kiểm tra các giá trị trống trong cột và sau đó cập nhật chúng thành 0 khi chúng được tìm thấy.

4

"4 O" có nghĩa là 0x40 là mã EBCDIC cho dấu cách hoặc ký tự trống và là giá trị mặc định được đặt vào bất kỳ khoảng trống mới nào trong bản ghi.

Chương trình/hoạt động cũ có thể giới thiệu lỗi dữ liệu thập phân. Ví dụ: nếu tệp mới được tạo và điền bằng lệnh CPYF với tùy chọn FMTOPT(*NOCHK).

Cách dễ nhất để sửa lỗi là viết chương trình HLL (RPG) để đọc tệp và sửa các bản ghi.

2

Nếu tệp bị tắt kiểm tra định dạng bản ghi [tức là. LVLCHK(*NO)] hoặc được ghi đè lên đó, sau đó là một chương trình HLL. (ví dụ: RPG, COBOL, v.v.) không được biên dịch lại với bản ghi mới có thể ghi lại các bản ghi có dữ liệu không hợp lệ trong cột này, đặc biệt nếu cột mới không ở cuối bản ghi.

Đảm bảo rằng tất cả các chương trình sử dụng I/O gốc để viết hoặc cập nhật bản ghi trên tệp này sẽ được biên dịch lại.

+0

Như James đã nói, một chương trình HLL có thể là cách dễ nhất để sửa các bản ghi hiện đang bị lỗi.Nhưng để ngăn ngừa các lỗi lặp lại, bạn sẽ cần phải biên dịch lại các chương trình ghi hoặc cập nhật các bản ghi trong tệp vật lý hoặc bất kỳ logic nào trên đó. – WarrenT

0

Tôi đã có thể giải quyết lỗi này bằng cách ép buộc các cột chính thành số nguyên. Tôi đã thay đổi tham gia từ này ...

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

... này ...

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

... và tôi không cần phải thực hiện bất kỳ điều chỉnh để các bảng. Đây là một cơ sở dữ liệu rất cũ, rất lộn xộn với rất nhiều rác trong đó. Tôi đã thực hiện nhiều chỉnh sửa, nhưng đó là một công việc đang được tiến hành.

Các vấn đề liên quan