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

Oracle 2 dấu gạch nối trong cột số?

Nó không có nghĩa gì cả, và nó không phải là 'cho' bất cứ điều gì; Tôi e rằng dữ liệu của bạn bị hỏng. -- là một giá trị thực tế từ bảng của bạn, nhưng nó không phải là một số. Biểu diễn nội bộ của Oracle cho các số được đề cập trong ghi chú 1031902.6 nếu bạn có quyền truy cập vào đó hoặc điều này giải thích nó nếu bạn không . Nếu nó thực sự là một số âm thì byte thập lục phân cuối cùng phải là 66. Bán phá giá số mà nó có vẻ là - với một dấu trừ duy nhất, không phải hai, là vô nghĩa - cho:

select dump(-1331013400000000000000000000, 1016) from dual;

DUMP(-1331013400000000000000000000,1016)
----------------------------------------
Typ=2 Len=6: 31,58,46,64,43,66           

Tạo các số không hợp lệ trong Oracle không đơn giản (tôi cho rằng bạn sẽ không mong đợi điều đó), nhưng đây là một phương pháp tôi đã sử dụng trước đây. Một trong những manh mối, ngoài dấu trừ kép và chúng đều có cùng độ dài, đó là việc chuyển đổi giá trị đã kết xuất trở lại thành một số không cho kết quả tương tự:

create table t42(value number);

declare
  n number;
begin
  dbms_stats.convert_raw_value('32ea004366', n);
  insert into t42 (value) values (n);
end;
/

select value from t42;

                                 VALUE
--------------------------------------
           -<3:13400000000000000000000

Đây là từ Oracle 9i, bây giờ tôi có cơ sở dữ liệu 8i đóng, vì vậy kết quả có thể thay đổi một chút.

Không thể thực hiện to_number(value) tất nhiên cũng là manh mối lớn; có một to_char() ngầm khi bạn làm điều đó, vì vậy nó đang cố gắng chuyển đổi biểu diễn văn bản thành một số, điều này giải thích lỗi. to_char() thú vị là giá trị không khớp với những gì một lựa chọn đơn giản thực hiện. Bạn sẽ gặp lỗi tương tự nếu bạn làm điều đó với dữ liệu của mình.

select to_number(value) from t42;
select to_number(value) from t42
                 *
ERROR at line 1:
ORA-01722: invalid number

select to_char(value) from t42;

TO_CHAR(VALUE)
----------------------------------------
-`003400000000000000000000

Trừ khi bạn biết dữ liệu xấu đến từ đâu và vẫn còn nguyên bản gốc, bạn có thể không thể lấy lại các giá trị này. Tôi nghĩ cách tốt nhất bạn có thể làm là bỏ qua nó hoặc thay thế nó bằng thứ gì đó sẽ di chuyển - nếu trường là null thì null sẽ là lựa chọn an toàn, nếu không, tôi đoán bạn phải chọn một giá trị kỳ diệu.

Việc xác định và sửa đổi các hàng bị ảnh hưởng có thể được thực hiện thông qua một hàm; có thể giống như:

create or replace function null_bad_number(value number)
return number deterministic as
  tmp_value number;
  invalid_number exception;
  pragma exception_init(invalid_number, -1722);
begin
  select to_number(value) into tmp_value from dual;
  return value;
exception
  when invalid_number then
    return null;
end;
/

Với cùng một giá trị không hợp lệ được tạo trước đó và một giá trị hợp lệ:

insert into t42 (value) values (0.9574875526618150);

select * from t42;

     VALUE
----------
-`.003E+24
.957487553

update t42 set value = null
where value is not null
and null_bad_number(value) is null;

1 row updated.

select * from t42;

     VALUE
----------

.957487553

Không lý tưởng bằng bất kỳ phương tiện nào, nhưng tại thời điểm này, tôi nghĩ rằng bạn đang tận dụng những gì bạn có thể. Bạn có thể xóa các hàng thay vì cập nhật chúng hoặc đặt giá trị thành một thứ khác, điều đó tùy thuộc vào cách bạn muốn tiếp tục.

Bạn có thể thử mời Oracle tham gia để xem liệu họ có thể tìm ra điều gì đã xảy ra hay không và xem liệu họ có bất kỳ thủ thuật nào để lấy lại giá trị ban đầu - điều này có vẻ khó xảy ra - nhưng tôi không chắc bạn sẽ nhận được nhiều sự hỗ trợ một phiên bản cũ của cơ sở dữ liệu.

Tất nhiên, nếu không biết cách thức và thời điểm tham nhũng được đưa ra (có thể là thông qua một lần nhập tinh vi, hoặc thông qua một chương trình OCI có lỗi), bạn phải đặt câu hỏi về tính hợp lệ của tất cả các dữ liệu khác, cả trong cột đó và ở những nơi khác. Trong trường hợp này, lỗi có vẻ rất đồng nhất - tất cả các giá trị không hợp lệ dường như được xây dựng theo cùng một cách - vì vậy bạn có thể ổn. Nói chung, một cái gì đó đặt các byte không chính xác vào một giá trị bên trong có thể tạo ra một giá trị sai, nhưng vẫn hợp lệ. Nó có thể trông đúng, hoặc nó có thể là những đơn hàng lớn hơn giá trị kỳ vọng ban đầu và thực sự không có cách nào để nói.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Câu lệnh INSERT trong Oracle

  2. tôi muốn chấp nhận đầu vào của người dùng trong PL SQL và chuyển nó vào thủ tục, hãy chỉ cho tôi một chương trình đơn giản cho nó?

  3. Làm cách nào để chỉ định thời gian chờ @lock trong truy vấn jpa dữ liệu mùa xuân?

  4. cách đặt lại cột Identity trong Oracle

  5. Oracle:Xóa từ dưới lên