2008-10-08 46 views
10

Chúng tôi nhận được đôi khi các lỗi sau đây từ cơ sở dữ liệu đối tác của chúng tôi:ORA-01.438: giá trị lớn hơn độ chính xác nhất định cho phép cột này

<i>ORA-01438: value larger than specified precision allows for this column</i> 

Câu trả lời đầy đủ trông giống như sau:

<?xml version="1.0" encoding="windows-1251"?> 
<response> 
    <status_code></status_code> 
    <error_text>ORA-01438: value larger than specified precision allows for this column ORA-06512: at &quot;UMAIN.PAY_NET_V1_PKG&quot;, line 176 ORA-06512: at line 1</error_text> 
    <pay_id>5592988</pay_id> 
    <time_stamp></time_stamp> 
</response> 

gì có thể là nguyên nhân gây ra lỗi này?

+0

Xem http://stackoverflow.com/questions/14357816/ora-01438-value-larger-than-specified-precision-allowed-for-this-column-when – Kiquenet

Trả lời

3

Điều này cho biết bạn đang cố đặt thứ gì đó quá lớn vào một cột. Ví dụ, bạn có một cột VARCHAR2 (10) và bạn đang đặt trong 11 ký tự. Điều tương tự với số.

Điều này đang diễn ra tại dòng 176 của gói UMAIN. Bạn sẽ cần phải đi và có một cái nhìn vào đó để xem những gì nó là đến. Hy vọng rằng bạn có thể tra cứu nó trong điều khiển nguồn của bạn (hoặc từ user_source). Các phiên bản sau của Oracle báo cáo lỗi này tốt hơn, cho bạn biết cột nào và giá trị nào.

6

Lỗi này có vẻ không phải là một trường ký tự, nhưng nhiều hơn một trường số. (Nếu đó là vấn đề về chuỗi như WW được đề cập, bạn sẽ nhận được 'giá trị quá lớn' hoặc một cái gì đó tương tự.) Có thể bạn đang sử dụng nhiều chữ số hơn số được cho phép, ví dụ: 1.000000001 trong một cột được định nghĩa là số (10,2).

Xem mã nguồn như WW được đề cập để tìm ra cột nào có thể gây ra sự cố. Sau đó kiểm tra dữ liệu nếu có thể đang được sử dụng ở đó.

1

Một vấn đề mà tôi gặp phải, và thật khủng khiếp, đó là lời gọi OCI để mô tả một thuộc tính cột hoạt động khác nhau tùy thuộc vào phiên bản Oracle. Mô tả một số cột đơn giản tạo ra mà không bất kỳ prec hoặc quy mô lợi nhuận differenlty trên 9i, 1Og và 11g

2

Tiếp tục câu trả lời trước đó, bạn nên lưu ý rằng một cột định nghĩa là varchars (10) sẽ lưu trữ 10 byte, chứ không phải 10 ký tự trừ khi bạn định nghĩa nó như VARCHAR2 (10 CHAR)

[câu hỏi của OP dường như được số liên quan ... đây là chỉ trong trường hợp bất cứ ai khác có vấn đề tương tự]

1

Từ http://ora-01438.ora-code.com/ (tài nguyên dứt khoát ngoài Hỗ trợ của Oracle):

ORA-01438: giá trị lớn hơn độ chính xác được chỉ định cho phép cho cột này
Nguyên nhân: Khi chèn hoặc cập nhật bản ghi, giá trị số được nhập vượt quá độ chính xác được xác định cho cột.
Hành động: Nhập giá trị tuân thủ độ chính xác của cột số hoặc sử dụng tùy chọn MODIFY với lệnh ALTER TABLE để mở rộng độ chính xác.

http://ora-06512.ora-code.com/:

ORA-06.512: tại chuỗi stringline
Nguyên nhân: vết lùi nhắn như ngăn xếp được unwound bởi ngoại lệ unhandled.
Hành động: Khắc phục sự cố gây ra ngoại lệ hoặc viết trình xử lý ngoại lệ cho điều kiện này. Hoặc bạn có thể cần liên hệ với quản trị viên ứng dụng hoặc DBA của bạn.

9

Số bạn đang cố gắng lưu trữ quá lớn đối với trường. Nhìn vào SCALE và PRECISION. Sự khác biệt giữa hai là số chữ số phía trước vị trí thập phân mà bạn có thể lưu trữ.

select cast (10 as number(1,2)) from dual 
      * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 

select cast (15.33 as number(3,2)) from dual 
      * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 

Bất cứ điều gì vào cuối thấp bị cắt (âm thầm)

select cast (5.33333333 as number(3,2)) from dual; 
CAST(5.33333333ASNUMBER(3,2)) 
----------------------------- 
         5.33 
+2

Thực ra, đầu dưới không bị cắt bớt, nhưng làm tròn trong Oracle: chọn cast (5.66666666 as number (3.2)) từ dual; -> Lợi nhuận 5,67 –

0

Nó có thể là một thói quen tốt để xác định các biến như dưới đây:

v_departmentid departments.department_id%TYPE; 

KHÔNG thích dưới đây:

v_departmentid NUMBER(4) 
0

FYI: vi phạm kích thước Trường số sẽ cho ORA-01.438: giá trị lớn hơn độ chính xác theo quy định được phép cho cột này

VARCHAR2 dài trường vi phạm sẽ cho ORA-12.899: giá trị quá lớn đối với cột ...

Oracle làm một sự phân biệt giữa các kiểu dữ liệu của cột dựa trên mã lỗi và thông báo.

Các vấn đề liên quan