我写了一个触发器,其中有一行:
SELECT *
INTO :NEW.EVENTDATE
FROM (SELECT SYSDATE
FROM DUAL);
由于某种原因,这不起作用(EVENTDATE列具有时间戳(0)类型)。
当我尝试插入某些内容时,我收到错误消息,指出该列的值太长。我虽然SYSDATE和时间戳(0)会合并并相互理解。
什么?
答案 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字段。