Oracle
 sql >> база данни >  >> RDS >> Oracle

Опитът да експортирате Oracle чрез PL/SQL дава дата 0000-00-00

Стойността, съхранена в тази колона, не е валидна дата. Първият байт на 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. И този предишен въпрос е донякъде свързан.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NLS_NUMERIC_CHARACTERS настройка за десетичен знак

  2. Инструкция UPDATE в Oracle с помощта на SQL или PL/SQL за актуализиране САМО на първия дублиран ред

  3. Какво представляват Oracle Joins (Sql Joins)?

  4. Създайте и конфигурирайте Oracle Linked Server в SQL Server

  5. Изберете групово събиране в пример на Oracle