Вопрос 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;