我写了一个触发器,其中有一行:
SELECT *
INTO :NEW.EVENTDATE
FROM (SELECT SYSDATE
FROM DUAL);
由于某种原因,这不起作用(EVENTDATE 列具有 timestamp(0) 类型)。
当我尝试插入某些内容时,我收到错误消息,指出该列的值太长。我虽然 SYSDATE 和 timestamp(0) 会合并并相互理解。
什么?
您应该在 PL/SQL 中执行此操作
:new.EventDate := SYSTIMESTAMP;
但是如果你想使用 SQL
SELECT systimestamp
INTO :new.EventDate
FROM dual;
尝试显式转换,例如
select cast(sysdate as timestamp(0)) from dual
作为一个想法,您的会话日历设置是否有任何异乎寻常的东西可能会导致不寻常的转换。如果是这样,请尝试在转换中指定适当的日历。
select to_char(sysdate,'DD-fmMonth-YYYY','nls_calendar=''Arabic Hijrah''') from dual;
我能够劝告我的老板将一个专栏的类型转换为另一种。即日期的时间戳。
奇怪的是,这个分支中没有人指出我可以用 DATE 字段替换 Timestamp 字段。
我不知道为什么这行不通。你能发布你得到的实际错误(带有代码和所有内容)吗?
我也不知道你为什么不只分配变量:
:NEW.EVENTDATE := systimestamp;
你运行的是什么版本?
以下在 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。因此,该错误可能与您发布的选择语句无关,而是与您实际尝试插入的数据有关。
此外,在相关说明中,您可以直接在触发器中分配 sysdate,即无需间接选择语句:
create trigger tq84_eventdate_trg
before insert on tq84_eventdate
for each row
begin
:new.eventdate := sysdate;
end tq84_eventdate_trg;
/