PL/SQL存储过程执行报ORA-06502,为何无法处理浮点数?
为什么调用存储过程时触发ORA-06502字符转数字错误?
先给你明确结论:你遇到的错误和NUMBER类型参数毫无关系,问题出在第四个DATE类型参数的隐式转换上,咱们一步步拆解:
问题到底出在哪?
你的存储过程里第四个参数P_GOOD_DATE定义的是DATE类型,但在第二个调用语句里,你直接传了个字符串'08.01.2018':
EXECUTE ADD_GOOD('some text...', 28, 2400.00, '08.01.2018');
Oracle需要把这个字符串自动转成DATE类型,但这个隐式转换完全依赖当前会话的NLS_DATE_FORMAT设置。如果你的会话默认日期格式不是DD.MM.YYYY(比如很多环境默认是DD-MON-RR,也就是类似08-JAN-18的格式),Oracle就没法正确解析这个字符串,解析失败时就会抛出你看到的ORA-06502字符转数字/日期转换错误——因为它试图把不符合格式的部分转成日期组件(比如月份、日期数字)时失败了。
你担心的NUMBER类型完全没问题:P_GOOD_PRICE作为NUMBER类型确实支持整数和浮点数,你传入的920和2400.00都不会触发错误,第一个调用没传第四个参数(用了默认的NULL)所以能正常执行,第二个调用的问题100%出在日期参数上。
怎么解决?
有两种靠谱的方式避免这种依赖环境的错误:
- 显式转换日期字符串:用
TO_DATE()函数指定格式,让Oracle明确知道怎么解析你的字符串:EXECUTE ADD_GOOD('some text...', 28, 2400.00, TO_DATE('08.01.2018', 'DD.MM.YYYY')); - 使用ANSI标准日期字面量:这种写法不依赖任何NLS设置,格式固定为
YYYY-MM-DD,非常稳妥:EXECUTE ADD_GOOD('some text...', 28, 2400.00, DATE '2018-01-08');
可以自己验证一下
你可以先查一下当前会话的日期格式,确认是不是格式不匹配导致的问题:
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
如果返回的不是DD.MM.YYYY,那就能完美解释为什么第二个调用失败了。
内容的提问来源于stack exchange,提问作者Артём Иванов
相关产品推荐
相关产品推荐

