Стойността, съхранена в тази колона, не е валидна дата. Първият байт на dump
трябва да бъде векът, който според бележката за поддръжка на Oracle 69028.1 се съхранява в нотация „излишък-100“, което означава, че трябва да има стойност 100 + действителният век; така че 1900 ще бъде 119, 2000 ще бъде 120, а 5500 ще бъде 155. Така че 44 ще представлява -5600; датата, която сте съхранили, изглежда всъщност представлява 5544-09-14 пр.н.е. . Тъй като Oracle поддържа само дати с години между -4713 и +9999, това не се разпознава.
Можете да пресъздадете това сравнително лесно; най-трудният бит е вкарването на невалидна дата в базата данни на първо място:
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
Така че това има един ред със същите данни като вас. Използване на alter session
Виждам какво изглежда като валидна дата:
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
Но ако използвам изрична маска за дата, тя просто получава нули:
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
И ако стартирам вашата процедура:
exec dump_table_to_csv('T42');
Полученият CSV има:
"DT"
"0000-00-00T00:00:00"
Мисля, че разликата е, че тези, които се опитват да покажат датата, се придържат към вътрешния тип данни за дата 12, докато тези, които показват нули, използват външен тип данни 13, както е споменато в бележка 69028.1.
Така че накратко, вашата процедура не прави нищо лошо, датата, която се опитва да експортира, е невалидна вътрешно. Освен ако не знаете коя дата е трябвало да бъде, което изглежда малко вероятно, като се има предвид отправната ви точка, не мисля, че можете да направите много по въпроса, освен да познаете или да го игнорирате. Освен ако може би не знаете как са били вмъкнати данните и не можете да разберете как са били повредени.
Мисля, че е по-вероятно да е от OCI програма, отколкото това, което направих тук; този "суров" трик е първоначално от тук. Може също така да погледнете бележка 331831.1. И този предишен въпрос е донякъде свързан.