在Oracle 11g存储过程中舍入时间戳(9)

时间:2011-01-21 22:07:25

标签: sql stored-procedures timestamp oracle11g

以下过程将时间戳(9)四舍五入为时间戳(6):

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))无法验证。

3 个答案:

答案 0 :(得分:1)

解决精度问题的一种方法是将其转换(与''连接)或在调用PROC时使用格式使用to_char。

将输入作为VARCHAR2?

转换可以在proc到TIMESTAMP(9)

的INSERT中进行

EDITED:显然我假设你的表字段是正确的TIMESTAMP(9),但也检查一下。

答案 1 :(得分: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)
...

这应该可以解决问题。参数列表中不允许使用数字约束类型。

答案 2 :(得分: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);