以下过程将时间戳(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))验证失败。
发布于 2011-01-22 17:22:41
CREATE
TABLE MY_TABLE
(
MY_TIMESTAMP TIMESTAMP(9) NOT NULL
)
CREATE OR REPLACE PROCEDURE "DB"."INSERT_ROW"
(myTimestamp IN MY_TABLE.MY_TIMESTAMP%TYPE)
...
这应该能起到作用。参数列表中不允许使用数字约束类型。
发布于 2011-01-22 06:12:54
解决精度问题的一种方法是转换它(与‘’连接),或者在调用PROC时使用带有格式的to_char。
将输入作为VARCHAR2?
转换可以在proc内的INSERT中进行,转换为时间戳(9)
编辑:显然我假设你的表字段是正确的时间戳(9),但也要检查一下。
发布于 2014-04-15 19:53:32
您还可以使用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);
https://stackoverflow.com/questions/4764314
复制相似问题