日期时间列ORA 12899的Oracle SYSDATE问题

时间:2011-02-02 21:34:15

标签: sql oracle triggers ora-12899

我写了一个触发器,其中有一行:

SELECT * 
  INTO :NEW.EVENTDATE 
  FROM (SELECT SYSDATE 
          FROM DUAL);

由于某种原因,这不起作用(EVENTDATE列具有时间戳(0)类型)。

当我尝试插入某些内容时,我收到错误消息,指出该列的值太长。我虽然SYSDATE和时间戳(0)会合并并相互理解。

什么?

5 个答案:

答案 0 :(得分:2)

你应该在PL / SQL中执行此操作

:new.EventDate := SYSTIMESTAMP;

但是如果你想使用SQL

SELECT systimestamp
  INTO :new.EventDate
  FROM dual;

答案 1 :(得分:1)

尝试显式转换,例如

select cast(sysdate as timestamp(0)) from dual

作为一个想法,您的会话的日历设置是否有任何异国情调可能会导致异常转换。如果是,请尝试在转化中指定相应的日历。

select to_char(sysdate,'DD-fmMonth-YYYY','nls_calendar=''Arabic Hijrah''') from dual;

答案 2 :(得分:0)

我不知道为什么这不起作用。你能发布实际的错误(包含代码和所有内容)吗?

我也不知道为什么你不会只分配变量:

:NEW.EVENTDATE := systimestamp;

答案 3 :(得分:0)

你在运行什么版本?

以下在Oracle 11R2上运行良好:

drop   table tq84_eventdate;

create table tq84_eventdate (
  data      varchar2(10),
  eventdate timestamp(0)
);

create trigger tq84_eventdate_trg 
before insert on tq84_eventdate 
for each row
begin

  SELECT * INTO :NEW.EVENTDATE FROM (SELECT SYSDATE FROM DUAL);

end tq84_eventdate_trg;
/


insert into tq84_eventdate (data) values ('test');

select * from tq84_eventdate;

但是,如果我做了

insert into tq84_eventdate (data) values ('value too large!');

我得到你提到的ORA-12899。因此,错误可能与您发布的select语句无关,而与您实际尝试插入的数据无关。

另外,在相关的说明中,您可以直接在触发器中分配sysdate,即没有select语句的间接:

create trigger tq84_eventdate_trg 
before insert on tq84_eventdate 
for each row
begin

  :new.eventdate := sysdate;

end tq84_eventdate_trg;
/

答案 4 :(得分:0)

我能够劝告我的老板将一个列的类型转换为另一个列。即日期的时间戳。

奇怪的是,这个分支中没有人没有指出我可以用DATE字段替换Timestamp字段。