2011-01-21 46 views
2

以下過程舍入時間戳(9)爲Timestamp(6):時間戳的舍入(9)中的Oracle 11g存儲過程

CREATE 
    TABLE MY_TABLE 
    (
     MY_TIMESTAMP TIMESTAMP(9) NOT NULL 
    ) 

CREATE OR REPLACE PROCEDURE "DB"."INSERT_ROW" 
(myTimestamp IN TIMESTAMP) 
AS 
v_sys_error NUMBER := 0; 
v_err INTEGER; 
v_rc INTEGER; 
BEGIN 

BEGIN 
    INSERT 
INTO 
    DB.INSERT_ROW 
    (
     MY_TIMESTAMP 
    ) 
    VALUES 
    (
     myTimestamp 
    ); 
EXCEPTION 
WHEN OTHERS THEN 
v_sys_error := SQLCODE; 
v_err := v_sys_error; 
v_rc := SQL%ROWCOUNT; 
RAISE; 
END; 

END; 

下面的調用將插入:2007-12-12 12: 23:45.123457000

@call DB.INSERT_ROW(TIMESTAMP '2007-12-12 12:23:45.123456789'); 

而下面的代碼將插入這樣的:2007-12-12 12:23:45.123456789

INSERT 
INTO 
    DB.MY_TABLE 
    (
     MY_TIMESTAMP 
    ) 
    VALUES 
    (
     TIMESTAMP '2007-12-12 12:23:45.123456789' 
    ); 

如何避免這種情況?使用(myTimestamp IN TIMESTAMP(9))無法驗證。

+0

確定表列足夠寬? – kurosch 2011-01-21 22:23:18

回答

1
CREATE 
    TABLE MY_TABLE 
    (
     MY_TIMESTAMP TIMESTAMP(9) NOT NULL 
    ) 

CREATE OR REPLACE PROCEDURE "DB"."INSERT_ROW" 
(myTimestamp IN MY_TABLE.MY_TIMESTAMP%TYPE) 
... 

這應該可以做到。在參數列表中不允許使用數字約束的類型。

1

之一來解決問題精確的方法是(與CONCAT「」),將其轉換或致電PROC時使用TO_CHAR用的格式。

將輸入作爲VARCHAR2?

轉換可以在PROC內發生在INSERT到TIMESTAMP(9)

編輯:顯然我假設你的表字段是正確TIMESTAMP(9),但檢查爲好。

0

您還可以使用timestamp_unconstrained類型:

create or replace procedure insert_row (myTimestamp timestamp_unconstrained) 
is 
begin 
    insert into my_table (my_timestamp) values (myTimestamp); 
end insert_row; 
/

檢查http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/predefined.htm

subtype TIMESTAMP_UNCONSTRAINED  is TIMESTAMP(9);