Вопрос Oracle SYSDATE для столбца даты и времени ORA 12899

Я написал триггер, в котором у меня есть строка:

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

По некоторым причинам это не работает (столбец EVENTDATE имеет тип timestamp(0)).

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

Что за?

5 ответов

Вы должны просто сделать это в 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;

Какую версию вы используете?

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

create trigger tq84_eventdate_trg 
before insert on tq84_eventdate 
for each row
begin

  :new.eventdate := sysdate;

end tq84_eventdate_trg;
/

Мне удалось убедить моих боссов преобразовать тип одного столбца в другой. А именно отметка времени ДАТЫ.

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

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

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

:NEW.EVENTDATE := systimestamp;
Другие вопросы по тегам