【DB2报错】执行存储过程报 SQLCODE:-420 SQLSTATE:22018,解决方法在这里。

07-21 972阅读

执行存储过程的时候碰到这个报错:

Invalid character found in a character string argument of the function  "DECFLOAT"...SQLSTATE:22018 SQLCODE:-420

不要慌!!遇事不决先翻译:

【DB2报错】执行存储过程报 SQLCODE:-420 SQLSTATE:22018,解决方法在这里。
(图片来源网络,侵删)

翻译:在函数 "DECFLOAT" 的字符串自变量中找到无效字符。

报错解释 :

原因分析:

处理方式:

情况一:

情况二:


报错解释 :

SQLCODE:-420  函数 函数名这里指的是报错信息里的DECFLOAT的字符串自变量包含在数字 SQL 常量中无效的字符。 由于使用 CAST 规范并将 函数名 DECFLOAT作为目标数据类型,或者将一个自变量隐式强制类型转换为数字数据类型而调用了此函数。 用于 SQL 语句中的函数或数据类型可能是 函数名 DECFLOAT的同义词。

SQLSTATE:22018 CAST 规范 或者 CAST 标量函数的字符值无效。

用户响应:更改 SQL 语句,使每个操作数或 VALUES 子句中的每行有完全相同的列数。


原因分析:

根据提示找到问题语句所在地方,是一个IF条件里的语句

/*--------------------------------------
情况一:字段类型说明 
DEPTNO decimal(2,0)
--------------------------------------*/
SELECT COUNT(1) FROM EMP WHERE DEPTNO  ''

/*---------------------------------------------
情况二:字段类型说明 
var_col varchar(8)
var_col里的枚举值都是数字,也有''(空字符串)的情况
-----------------------------------------------*/
SELECT var_col FROM test_table WHERE var_col > 0

处理方式

情况一:

SELECT COUNT(1) FROM EMP WHERE DEPTNO ''

这个判断是无效的,可以把条件去掉,但是在mysql那里是可以执行的。

ps:因为 DEPTNO 字段类型 decimal 它属于数值类型之一,所以字段本来就不允许出现空字符串的情况,所以where 条件那里不能够和 '' 进行比较。


情况二:

SELECT var_col FROM test_table WHERE var_col > 0:

如果不用 CAST 函数转换 var_col想和0比较改成以下两种语句之一就可以了:

# 和'0' 字符串进行比较
SELECT var_col FROM test_table WHERE var_col > '0'
# 用函数把0转成字符串
SELECT var_col FROM test_table WHERE var_col > to_char(0)

ps:

  1. 如果字段类型是 varchar 类型你要对它进行数值比较,需要把值转成数字的字符串形式,所以例子中的 var_col varchar(8) 虽然里面的值都是数字,但是和整数 0 比较会报错的。
  2. 另外假如 var_col 里面的数据 存在 ‘’ 两个引号的这种空字符串,这条sql 也会报错但是转成字符串就可以比较。

存储过程一定要用日志作为debug,方便找问题。

其他报错 的原因码以及其他报错的错误状态码可以在下面 IBM 的链接查看。

👇👇👇👇👇👇👇👇👇👇👇
SQL0500 - SQL0749 - IBM Documentationhttps://www.ibm.com/docs/en/db2/11.1?topic=messages-sql0500-sql0749#sql0668n有需要文档的同学也可以私信我~

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]