plsql中,case when语句和decode存在类似的类型隐式转换处理。
映射的值会根据第一个值的类型进行隐式转换,也就是说,如果第一个值是数值型,
则后续也会转换成数值型。因此,如果后面某个值是非数字值则会出现转型错误。比如下面的情况:
declare
v_retval varchar2(100);
p_content varchar2(100) := '军12312422';
p_dcval varchar2(100) := '-';
begin
v_retval := case length(p_content)
when 15 then mod(substr(p_content, 15, 1), 2)
when 18 then mod(substr(p_content, 17, 1), 2)
else p_dcval
end;
end;
会出现下面错误:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 9
因为前面两个做了mod处理后,系统默认为是数值型值了。但是遇到p_dcval发现是'-',是非数字型
无法转换,因此报错。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12932950/viewspace-714653/
,如需转载,请注明出处,否则将追究法律责任。