Вопрос Oracle SYSDATE для столбца даты и времени ORA 12899 - PullRequest
1 голос
/ 03 февраля 2011

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

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

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

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

Что за?

Ответы [ 5 ]

2 голосов
/ 03 февраля 2011

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

:new.EventDate := SYSTIMESTAMP;

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

SELECT systimestamp
  INTO :new.EventDate
  FROM dual;
1 голос
/ 03 февраля 2011

Попробуйте явное приведение типа

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

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

select to_char(sysdate,'DD-fmMonth-YYYY','nls_calendar=''Arabic Hijrah''') from dual;
0 голосов
/ 03 февраля 2011

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

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

0 голосов
/ 03 февраля 2011

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

На 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;
/
0 голосов
/ 03 февраля 2011

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

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

:NEW.EVENTDATE := systimestamp;
...