insert into masakr.tb_kr_cs_24739_day
    (statis_date,
     STAFF_ID,
     cnt_1st,
     cnt_submit,
     tc_cnt,
     jt_cnt,
     hb_cnt,
     jt_cnt_no_wf,
     hb_cnt_no_wf)
    select a.statis_date,
           a.STAFF_ID,
           cnt_1st,
           cnt_submit,
           cnt_1st_submit,
           jt_cnt,
           hb_cnt,
           b.call_cnt_no_wf,
           b.su_call_back_no_wf
      from (select t.statis_date,
                   t.STAFF_ID,
                   sum(cnt_1st) cnt_1st,
                   sum(cnt_submit) cnt_submit,
                   sum(cnt_1st + cnt_submit) cnt_1st_submit,
                   sum(jt_cnt) jt_cnt,
                   sum(hb_cnt) hb_cnt
              from masakr.tb_kr_cs_24739_day_mid1 t
             group by t.statis_date, t.STAFF_ID) a,
           masakr.tb_kr_cs_36371_mid2 b
     where nvl(a.STAFF_ID, '1') = nvl(b.staff_id_callback(+), '1')
       and a.statis_date = b.statis_date(+);
这是修改后的代码,我只把 nvl(a.STAFF_ID, 1) = nvl(b.staff_id_callback(+), 1
 )修改为了 nvl(a.STAFF_ID, '1') = nvl(b.staff_id_callback(+), '1'),
STAFF_ID和staff_id_callback均是varchar2数据类型,
在修改之前每次运行到这段代码的时候,都会报ora03113的错误,修改之后立马就没问题了,
请教各位大神,为什么这种数据类型的不一致会导致ora03113的错误,而且oracle应该可以将
number类型隐式转化为varchar2类型吧,真诚求教

解决方案 »

  1.   

    这是修改后的代码,我只把 nvl(a.STAFF_ID, 1) = nvl(b.staff_id_callback(+), 1
     )修改为了 nvl(a.STAFF_ID, '1') = nvl(b.staff_id_callback(+), '1'),
    如果两个变量做比较,其中一个是 number ,oracle 就会把另一个转化成 number 来执行,但是如果另一个含非数值的字符,比如字母,就是转换失败。
      

  2.   

    举个例子给你:比如一个字段是varchar2类型的,但是这个字段现在保存的都是数字,没有字母和其他特殊字符,那么你查询的时候条件可以写:字段=100,这样也不会报错,但是如果某一天,这个字段存进来一个字母,你之前的那个字段=100就编译不过了,明白了吗
      

  3.   

    所以,只要是varchar2类型的字段,不管是不是数字,都不要吝啬单引号''