2011-02-02 3 views
1

я написал триггер, в котором у меня есть строка:Oracle SYSDATE вопрос для столбца даты и времени ORA 12899

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

По какой-то причине это не работает (колонка EVENTDATE имеет метку времени (0) типа).

Когда я пытаюсь что-то вставить, я получаю сообщение об ошибке, говорящее, что значение слишком велико для этого столбца. Я, хотя SYSDATE и timestamp (0) объединились и поняли друг друга.

Что такое?

+1

Можете ли вы разместить фактический DDL своего стола? Исправленная вами ошибка подразумевает, что EventDate объявляется как VARCHAR2, а не как TIMESTAMP. –

+1

Или что проблема не в триггере, а в фактическом заявлении INSERT. –

ответ

2

Вы должны просто сделать это в PL/SQL

:new.EventDate := SYSTIMESTAMP; 

, но если вы хотите использовать SQL

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

Та же ошибка, что и выше – Nickolodeon

0

Я не знаю, почему это не будет работать. Можете ли вы опубликовать фактическую ошибку (с кодом и всем), которую вы получаете?

Я также не знаю, почему вы не просто присвоить переменной:

:NEW.EVENTDATE := systimestamp; 
+0

Поскольку она дает ту же ошибку, что фактическая ширина 11 слишком велика для столбца с шириной 7! – Nickolodeon

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 непосредственно в триггере, то есть без косвенности избранного заявления:

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

+0

Я не верю, что вы не используете не 10 g. Скорее вам нужно уменьшить длину другого значения, которое вы пытаетесь вставить. –

1

Try явного приведения таких как

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

Как мысль, есть ли что-нибудь экзотическое в настройках календаря вашей сессии, что может привести к необычному преобразованию. Если это так, попробуйте указать соответствующий календарь при преобразовании.

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

Thanx. I фактически на моем пути к изучению встроенных функций Oracle. – Nickolodeon

0

Я смог увещевать своих боссов, чтобы преобразовать тип одного столбца в другой. А именно временная метка DATE.

Как ни странно, никому в этой ветке не указывалось, что я могу заменить поле Timestamp полем DATE.