我碰巧在试验插入行记录时,是该表的before insert触发器先执行,
还是隐式类型转换先执行? 其间又碰到另一个很奇怪的问题,
Test_tab表有字段start_date,类型为date,test_tab表有触发器test_trig,
主体如下
:new.start_date:=to_date(:new.start_date,’dd-mon-yy’,’nls_language=chinese.zhs16gbk’);
Insert into temp values(‘success’);
注册表表量nls_date_format=’dd-mon-yy’,nls_lang=’simplified Chinese_china.zhs16gbk’,
当我insert into test_tab values(’08-5月-99’) 时报错
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误
ORA-06512: 在 "SYSTEM.TEST_TRIG", line 2
ORA-04088: 触发器 'SYSTEM.TEST_TRIG' 执行过程中出错
我觉得
1.如果触发器先于隐式类型转换执行,触发器把字符串’08-5月-99’按那个格式解析成日期类型,
后再insert 到表里,怎么可能报那个错误呢;
2.如果隐式类型转换先于触发器执行,那字符串’08-5月-99’按注册表变量解析成日期类型,
再经过触发器,更不可能出错啊,虽然:new.start_date此时已是日期类型,但To_date函数将传入参数
:new.start_date又转成字符串,再按to_date的日期格式解析成日期类型。
还是隐式类型转换先执行? 其间又碰到另一个很奇怪的问题,
Test_tab表有字段start_date,类型为date,test_tab表有触发器test_trig,
主体如下
:new.start_date:=to_date(:new.start_date,’dd-mon-yy’,’nls_language=chinese.zhs16gbk’);
Insert into temp values(‘success’);
注册表表量nls_date_format=’dd-mon-yy’,nls_lang=’simplified Chinese_china.zhs16gbk’,
当我insert into test_tab values(’08-5月-99’) 时报错
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误
ORA-06512: 在 "SYSTEM.TEST_TRIG", line 2
ORA-04088: 触发器 'SYSTEM.TEST_TRIG' 执行过程中出错
我觉得
1.如果触发器先于隐式类型转换执行,触发器把字符串’08-5月-99’按那个格式解析成日期类型,
后再insert 到表里,怎么可能报那个错误呢;
2.如果隐式类型转换先于触发器执行,那字符串’08-5月-99’按注册表变量解析成日期类型,
再经过触发器,更不可能出错啊,虽然:new.start_date此时已是日期类型,但To_date函数将传入参数
:new.start_date又转成字符串,再按to_date的日期格式解析成日期类型。
2.你的to_date写法有问题。应该写为:new.start_date:=to_date(:new.start_date,'dd-mon-yy','nls_date_language=''SIMPLIFIED CHINESE''');
我之前用nls_date_format=american可以转换英文日期,
但用nls_date_format=simplified chinese就不行,为什么
此处得加单引号呢,好奇怪;而且我那样使用nls_language=chinese.zhs16gbk
是可以在select to_date('05-5月-99','dd-mon-yy','nls_language=chinese.zhs16gbk')
from dual中成功转换中文日期,没理由在触发器就不行呀。
请高手继续解惑。
C:\>set nls_lang=american_america.zhs16gbkC:\>sqlplus fang/fangSQL*Plus: Release 10.2.0.1.0 - Production on Fri May 9 08:57:05 2008Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining optionsSQL> select to_char(sysdate,'yy-mon-dd') from dual;TO_CHAR(SYSD
------------
08-may-09SQL> select to_char(sysdate,'yy-mon-dd','nls_language=chinese.zhs16gbk') from du
al;TO_CHAR(SYSD
------------
08-may-09SQL> select * from nls_session_parameters where parameter like '%LANGUAGE';PARAMETER VALUE
-------------------- ------------------------------
NLS_LANGUAGE AMERICAN
NLS_DATE_LANGUAGE AMERICAN