问题描述:
UltraEdit本地写一个存储过程,上传到linux服务器,执行存储过程,db2 -td@ -vf AIP_DD_CLEAR500.sql ,报错:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0408N A value is not compatible with the data type of its assignment
target. Target name is "S_ERRLVL". LINE NUMBER=7. SQLSTATE=42821
问题解决:
1、先查询db2错误码42821,释义为“数值不能被更新或插入,因为他与列的数据类型不兼容”,初步判断可能为数据库表的列和存储过程中的列格式不符,开始检查两者区别,发现完全一致,排除此原因;
2、判断是否自己导入方式异常,在linux上找一个正常的存储过程,执行,可以正常导入,说明导入方法正确;
3、由1,2可以判断是自己存储过程的问题,开始对比服务器上可以正常导入的文件和不能导入的文件,发现文件格式不一样:
[appuser@busquery lizhao_bak]$ file -i AIP_DD_CLEAR*.sql
AIP_DD_CLEAR100.sql: text/plain; charset=iso-8859-1
AIP_DD_CLEAR500.sql: text/plain; charset=utf-8
[appuser@busquery lizhao_bak]$
此时,恍然大悟,原来是文件格式导致异常,进一步浏览异常文件,发现文件中很多字符乱码,更加证明格式异常;这也是因为前几天本地写的存储过程直接上传格式正常,下意识忽略了这个问题。本地重新编辑文件,修改文件格式,UE-文件-转换-Unicode转ASCLL(O),转换格式完成,重新上传文件,浏览文件,显示正常,再次执行,成功 。
问题总结:
1、linux上执行文件时一定要先检查文件是否正常,尤其是从本地上传的文件;
2、如果文件异常,什么样的报错都有可能发生;