我在存储过程里要处理一下日期,在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;
在程序中再次执行该操作,然后到日志表中查看