我碰巧在试验插入行记录时,是该表的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的日期格式解析成日期类型。

解决方案 »

  1.   

    1.隐式转换优先于触发器
    2.你的to_date写法有问题。应该写为:new.start_date:=to_date(:new.start_date,'dd-mon-yy','nls_date_language=''SIMPLIFIED CHINESE'''); 
      

  2.   

        谢谢楼上,第一个问题解决了,但是第二个回答让我想起:
        我之前用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中成功转换中文日期,没理由在触发器就不行呀。
        请高手继续解惑。
      

  3.   

    'nls_language=chinese.zhs16gbk'对于to_char/to_date是无用的,因为你当前的环境nls_date_language就是simplified chinese,所以你误认为'nls_language=chinese.zhs16gbk'起作用了。
    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