2011-02-02 28 views
1

甲骨文SYSDATE問題,我寫了一個觸發器中,我有一個線:爲datetime列ORA 12899

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

出於某種原因,這並不工作(EVENTDATE列有時間標記(0)型)。

當我嘗試插入某些內容時,出現錯誤消息,指出該列的值太長。我雖然SYSDATE和時間戳(0)會合並和理解對方。

什麼?

+1

你可以發佈你的表的實際DDL?您得到的錯誤強烈意味着EventDate被聲明爲VARCHAR2,而不是TIMESTAMP。 – 2011-02-02 22:06:20

+1

或者說問題不在觸發器中,而是在實際的INSERT語句中。 – 2011-02-02 22:21:16

回答

2

你應該只是做在PL/SQL

:new.EventDate := SYSTIMESTAMP; 

,但如果你想使用SQL

SELECT systimestamp 
    INTO :new.EventDate 
    FROM dual; 
+0

與上面相同的錯誤 – Nickolodeon 2011-02-02 21:51:33

0

我不知道爲什麼,這是行不通的。你能發佈你得到的實際錯誤(包括代碼和一切)嗎?

我也不知道你爲什麼會不只是分配變量:

:NEW.EVENTDATE := systimestamp; 
+0

由於它產生相同的錯誤,實際寬度11對於寬度爲7的列太大! – Nickolodeon 2011-02-02 21:50:16

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; 
/
+0

我正在使用10g。我似乎無法找到修改該列的Width屬性的方法。它是7,這就是它(我需要11,根據例外 – Nickolodeon 2011-02-02 21:47:00

1

嘗試進行明確的轉換,如

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

作爲一個想法,會議的日曆設置有沒有異乎尋常的可能會強制轉換。如果是這樣,請嘗試在轉換中指定適當的日曆。

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

我能夠叮my我的老闆,將一列的類型轉換爲另一列。即時間戳到DATE。

奇怪的是,整個這個分支沒有人指出我可以用DATE字段替換Timestamp字段。