Вам необходимо выполнить преобразование, если ваш параметр сеанса ' NLS_DATE_FORMAT ' не равен ' мм / дд / гггг '.
Например:
create table myTbl (id number, cdat date);
select *
from nls_session_parameters ns
where ns.parameter = 'NLS_DATE_FORMAT';
PARAMETER VALUE
-------------------------------------------------------
NLS_DATE_FORMAT DD-MON-RR
В этом случае без to_Date вы получите ошибку:
insert into myTbl
values
(123, '12/05/2011');
ORA-01843: not a valid month
Вы можете изменить этот параметр на уровне сеанса, системного уровня и т. Д.
zep@dev> alter session set NLS_DATE_FORMAT = 'mm/dd/yyyy';
Session altered
select *
from nls_session_parameters ns
where ns.parameter = 'NLS_DATE_FORMAT';
PARAMETER VALUE
-------------------------------------------------------------------------------------
NLS_DATE_FORMAT mm/dd/yyyy
insert into myTbl
(id, cdat)
values
(123, '12/05/2011');
1 row inserted
zep@dev> select *
2 from myTbl;
ID CDAT
---------- -----------
123 05/12/2011
Проверка триггера уровня строки
truncate table Mytbl;
alter session set NLS_DATE_FORMAT = 'DD-MON-RR';
create or replace trigger befins_myTbl
before insert on myTbl
for each row
declare
begin
-- demo
:new.cdat := :new.cdat + numtoyminterval(1,'YEAR');-- (demo trigger add 1 year )
end;
insert into myTbl
(id, cdat)
values
(123, '12/05/2011');
Вывод : ORA-01843: недопустимый месяц
alter session set NLS_DATE_FORMAT = 'mm/dd/yyyy';
insert into myTbl
(id, cdat)
values
(123, '12/05/2011');
commit;
select *
from myTbl;
выход
ID CDAT
---------- -----------
123 12/05/2012