Giá trị được lưu trữ trong cột đó không phải là ngày hợp lệ. Byte đầu tiên của dump
nên là thế kỷ, theo ghi chú hỗ trợ của Oracle, 69028.1 được lưu trữ trong ký hiệu 'vượt quá 100', có nghĩa là nó phải có giá trị bằng 100 + thế kỷ thực; vì vậy 1900 sẽ là 119, 2000 sẽ là 120, và 5500 sẽ là 155. Vì vậy 44 sẽ đại diện cho -5600; ngày bạn đã lưu trữ dường như thực sự đại diện cho 5544-09-14 BC . Vì Oracle chỉ hỗ trợ các ngày có năm từ -4713 đến +9999, điều này không được công nhận.
Bạn có thể tạo lại điều này khá dễ dàng; bit khó nhất là đưa ngày không hợp lệ vào cơ sở dữ liệu ngay từ đầu:
create table t42(dt date);
Table created.
declare
d date;
begin
dbms_stats.convert_raw_value('2c9c090e010101', d);
insert into t42 (dt) values (d);
end;
/
PL/SQL procedure successfully completed.
select dump(dt), dump(dt, 1016) from t42;
DUMP(DT)
--------------------------------------------------------------------------------
DUMP(DT,1016)
--------------------------------------------------------------------------------
Typ=12 Len=7: 45,56,9,14,1,1,1
Typ=12 Len=7: 2d,38,9,e,1,1,1
Vì vậy, điều này có một hàng duy nhất có cùng dữ liệu mà bạn làm. Sử dụng alter session
Tôi có thể thấy những gì trông giống như một ngày hợp lệ:
alter session set nls_date_format = 'DD-Mon-YYYY';
select dt from t42;
DT
-----------
14-Sep-5544
alter session set nls_date_format = 'YYYYMMDDHH24MISS';
select dt from t42;
DT
--------------
55440914000000
Nhưng nếu tôi sử dụng mặt nạ ngày rõ ràng thì nó chỉ nhận được số không:
select to_char(dt, 'DD-Mon-YYYY'), to_char(dt, 'YYYYMMDDHH24MISS') from t42;
TO_CHAR(DT,'DD-MON-Y TO_CHAR(DT,'YY
-------------------- --------------
00-000-0000 00000000000000
Và nếu tôi chạy thủ tục của bạn:
exec dump_table_to_csv('T42');
CSV kết quả có:
"DT"
"0000-00-00T00:00:00"
Tôi nghĩ rằng sự khác biệt là những người cố gắng hiển thị ngày tháng gắn với kiểu dữ liệu ngày tháng nội bộ 12, trong khi những người hiển thị số 0 đang sử dụng kiểu dữ liệu bên ngoài 13, như đã đề cập trong ghi chú 69028.1.
Vì vậy, tóm lại, thủ tục của bạn không làm gì sai, ngày mà nó đang cố gắng xuất là không hợp lệ trong nội bộ. Trừ khi bạn biết ngày đó được cho là ngày nào, điều này dường như không chắc với điểm xuất phát của bạn, tôi không nghĩ bạn có thể làm gì nhiều ngoài việc đoán hoặc bỏ qua nó. Trừ khi, có lẽ, bạn biết cách dữ liệu được đưa vào và có thể tìm ra cách nó bị hỏng.
Tôi nghĩ nó có nhiều khả năng đến từ một chương trình OCI hơn những gì tôi đã làm ở đây; thủ thuật 'thô' này ban đầu xuất phát từ đây. Bạn cũng có thể muốn xem ghi chú 331831.1. Và câu hỏi trước này có phần liên quan.