Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cố gắng xuất một Oracle qua PL / SQL sẽ đưa ra ngày từ 0000-00-00

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. không có ocijdbc9 trong java.library.path

  2. Tôi nên đặt tài nguyên trình cài đặt ở đâu (tệp wxs, dmg-script, biểu tượng) và cách định cấu hình antrun maven khi triển khai ứng dụng độc lập

  3. Tạo chèn sql vào cho Oracle

  4. cung cấp tên người dùng và mật khẩu chính xác, nhận được ORA-01017:tên người dùng / mật khẩu không hợp lệ; Đăng nhập đã bị từ chối

  5. Làm cách nào để chuyển hướng đầu ra của DBMS_OUTPUT.PUT_LINE thành một tệp?