【问题标题】:Rounding of Timestamp(9) in Oracle 11g stored procedureOracle 11g 存储过程中 Timestamp(9) 的舍入
【发布时间】:2011-06-13 10:53:29
【问题描述】:

以下过程将 Timestamp(9) 舍入为 Timestamp(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)) 验证失败。

【问题讨论】:

  • 你确定表格列够宽吗?

标签: sql stored-procedures timestamp oracle11g


【解决方案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】:

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

    将输入作为 VARCHAR2 吗?

    转换可以在 proc 中的 INSERT 中进行到 TIMESTAMP(9)

    已编辑:显然我假设您的表字段是正确的 TIMESTAMP(9),但也要检查一下。

    【讨论】:

      【解决方案3】:

      你也可以使用 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 2020-06-15
        相关资源
        最近更新 更多