当前位置: 代码迷 >> Oracle开发 >> ORA-01830: 日期格式图片在转换整个输入字符串之前结束:这个怎么办
  详细解决方案

ORA-01830: 日期格式图片在转换整个输入字符串之前结束:这个怎么办

热度:63   发布时间:2016-04-24 06:39:40.0
ORA-01830: 日期格式图片在转换整个输入字符串之前结束:这个怎么处理?
我在存储过程里要处理一下日期,在PLSQL里测试存储过程是没有问题的,在JAVA里调用时就出现了标题的错误;
参数:(in_kprq_y  in VARCHAR2,----日期年份:如2014
                in_kprq    in VARCHAR2,---日期:如2014-06
                in_dp_id   in VARCHAR2
                 ) is  都是VARCHAR2类型;
--抽取数据
insert into TEMP_CWK_MTYYSRMXB
      SELECT 2           ysfs,
       Y.dxJSMX_DS DS,
       Y.dxJSMX_JE JE,
        X.DXJS_KDRQ KPRQ,
       decode(M.SS_ID,1,1,2) ss_id,
       decode(k.sck_klb,1,1,decode(Y.CP_ID,13,13,14,14,100)) cp_id,
       decode(M.HY_ID,1,1,2,2,3,3,4) hy_id,
       k.sck_klb sck_klb
  FROM XY_dxJS X, XY_dxJSMX Y, XJ_ZCD Z, XJ_SCK K, XJ_KHXX M
 WHERE X.dxJS_ID = Y.dxJS_ID
   AND Y.ZCD_ID = Z.ZCD_ID
   AND Z.BM_ID = K.BM_ID
   AND X.dxJS_SHDW = M.KH_ID
   AND k.sck_klb IN (1,8)
   AND Y.FYXZ_ID <> 9
   AND x.dp_id IN
           (select column_value from table(split(in_dp_id, ',')))
----dxjs_kdrq 开票日期  格式yyyy/MM/dd

   AND ((to_char(x.dxjs_kdrq,'yyyy')=in_kprq_y  AND to_char(x.dxjs_kdrq,'yyyy-mm') <=in_kprq)
-----下面是取 日期之前的当年数据  (如:2014-01 至 2014-06)
       OR (to_char(x.dxjs_kdrq,'yyyy')=to_char(ADD_MONTHS(to_date(in_kprq_y,'yyyy'), -12),'yyyy')
----取  去年同期数据  (如:2013-01 至 2013-06)
           AND to_char(x.dxjs_kdrq,'yyyy-mm') <=to_char(ADD_MONTHS(to_date(in_kprq,'yyyy-mm'), -12),'yyyy-mm'))
   );
调整了几次,没看出哪儿的转换出了问题,哪位大神帮忙看看,谢谢啦
TEMP_CWK_MTYYSRMXB是个全局临时表,出了日期字段是date类型  其他全是number、、、
------解决方案--------------------
一般就两个地方
1,隐式转换。如果=两边一边是date型,一边是字符型,则会进行一个to_date隐式转换。你的语句里看起来没有
2,传入参数。由于某种原因,程序在执行的时候,参数发生了改变

可以增加一个exception部分来排查。例如,建一个错误日志表err_log(errmsg varchar2(1000),paramvalue varchar2(1000),occurtime date);

在存储过程的end前加上异常处理:
exception
when others then
insert into err_log(errmsg,paramvalue,occurtime)values(sqlerrm,'in_kprq_y:'
------解决方案--------------------
in_kprq_y
------解决方案--------------------
';in_kprq:'
------解决方案--------------------
in_kprq
------解决方案--------------------
'; in_dp_id:'
------解决方案--------------------
 in_dp_id,sysdate);
commit;

在程序中再次执行该操作,然后到日志表中查看