2013-06-05 20 views
-1

我試圖運行PostgreSQL數據庫中以下DML語句:在PostgreSQL中執行INSERT語句時出錯?

INSERT INTO HMS_RESERVE_CANCEL_DTL 
(DIVISION_CODE,   
    UNIT_CODE,    
    RESERVATION_NO,  
    RESERVATION_DATE,  
    CANCELLATION_NO, 
    CANCELLATION_DATE, 
    CANCELLED_AT_UNIT, 
    CANCELLATION_AMOUNT, 
    CANCELLED_BY, 
    CANCELLATION_REASON, 
    REFUND_AMOUNT, 
    POSTED_TO_FAS, 
    CANCEL_PER, 
    room_type, 
    no_of_rooms, 
    taxes) 
values(
    '103', 
    '10303', 
    'GHA1314HTLRS000157', 
    case trim('') when trim('08-05-2013') then null else to_date('08-05-2013','DD-MM-YYYY HH24:MI:SS') end, 
    'GHA1314HTLCL000002', 
    current_date, 
    '10303', 
    5200.0, 
    '001721', 
    'my parsanal', 
    '53260.00', 
    'N', 
    10.0, 
    '02', 
    '10', 
    '10320.0') 

上面的語句開始,但有以下錯誤消息後不久出現故障:

ERROR: numeric field overflow 
SQL state: 22003 
Detail: The absolute value is greater than or equal to 10^4 for field with precision 6, scale 2. 

請幫我擺脫這個錯誤(或者至少將我指向正確的方向)。我的表(hms_rserve_cancel_dtl)表結構如下:

CREATE TABLE hms_reserve_cancel_dtl 
(
    division_code character varying(3) NOT NULL, 
    unit_code character varying(5) NOT NULL, 
    reservation_no character varying(20) NOT NULL, 
    reservation_date date NOT NULL, 
    cancellation_no character varying(20) NOT NULL, 
    cancellation_date date NOT NULL, 
    cancelled_at_unit character varying(15) NOT NULL, 
    cancellation_amount numeric(7,2), 
    cancelled_by character varying(35), 
    cancellation_reason character varying(200), 
    refund_amount numeric(7,2), 
    posted_to_fas character(1) DEFAULT 'N'::bpchar, 
    posted_date date, 
    remarks character varying(200), 
    status character(1) DEFAULT 'A'::bpchar, 
    cancel_per numeric(7,2), 
    room_type character varying(2), 
    no_of_rooms character varying(2), 
    refund_status character(1), 
    refunded_date date, 
    taxes numeric(6,2) DEFAULT 0.00, 
    CONSTRAINT hms_reserve_cancel_dtl_div_unit_code_fkey FOREIGN KEY (division_code, unit_code) 
     REFERENCES aptdc_units_mst (division_code, unit_code) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT hms_reserve_cancel_dtl_reservation_no_fkey FOREIGN KEY (reservation_no, room_type) 
     REFERENCES hms_reservation_mst (reservation_no, room_type) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 
WITHOUT OIDS; 
ALTER TABLE hms_reserve_cancel_dtl OWNER TO postgres; 
GRANT ALL ON TABLE hms_reserve_cancel_dtl TO postgres; 
+5

你認爲這是什麼(「絕對值大於或等於10^4,精度爲6,比例爲2」)是指?如果您試圖將10個人插入智能,會發生什麼?確切地說,CarOverflowException! – Burkhard

+3

不要試圖諷刺,但一看我認爲模式需要比插入查詢更多的幫助。 – zxq9

回答

1

PostgreSQL Docs:

數值的規模是在小數部分十進制數字的計數,小數點的右邊。數字的精度是整數中有效位數的總數,即小數點兩側的位數。所以23.5141數量爲6的精度和4.

分例如10123.435將不適合在numeric(4,2)

create table tmp (
    a numeric (8,5) 
    ); 

/* ok */ insert into tmp values (123.12345); 
/* ok */ insert into tmp values (1.1); 
-- this will result in 1.12346, because precicion is set to 5! 
insert into tmp values (1.123456); 

/* owerflow */ insert into tmp values (1000); 
-- because of number gets rounded to 5 decimal numbers: 
/* owerflow */ insert into tmp values (999.99999999999999999999); 
+0

好的,謝謝。 –

1

你的稅字段被設計爲數字(6,2),這意味着一個總共6位數字。小數點前4位,後2位。您提供的值在小數點前有5位數,因此不適合。

1

您已將稅率定義爲最大6位數,其中2位於小數部分,表示9999.99是您可以插入的最大值。在插入時,嘗試插入對此列太大的10320.0。

+0

OOkay傢伙,謝謝 –

+0

@DilipReddy請確保[接受正確答案之一](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235) 。你應該爲你所問的所有問題(你有一個可接受的答案)做這件事。 –