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

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

SQLERRM : SQL0401N The data types of the operands for the operation "=" are not compatible or comparable.

SQLSTATE:42818

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

翻译:SQL0401N 操作 运算符  “=” 的操作数的数据类型不兼容或不可比较。

报错解释 :

原因分析:

处理方式:


报错解释 

SQLCODE:401   错误状态码,

由于下列其中一种原因,不能处理使用 运算符 的操作

  • 操作数的数据类型必须兼容并且可比较,但是至少有一对类型不兼容或者不可比较。
  • 操作数的数据类型是 XML,该数据类型不能(与它自己或任何其他类型)进行比较。
  • 操作数的数据类型是 DATALINK,该数据类型不能(与它自己或任何其他类型)进行比较。
  • 操作数的数据类型是结构化类型,该数据类型不能(与它自己或任何其他类型)进行比较。
  • 不能直接比较两个 Hadoop 表中类型为数组的列。
  • 不能直接比较两个 Hadoop 表中类型为行的列。

SQLSTATE:-42818 错误类代码,运算符或函数的操作数不兼容或者不可比较。

用户响应:检查所有操作数的数据类型以确保其与语句的用法可比较及兼容。

如果所有 SQL 语句操作数都正确并正在访问视图,那么检查所有视图操作数的数据类型。


原因分析

根据提示找到问题语句所在地方,按提示 “=” 两边就只有 BATCH_DATE 和 PI_DATE了,因为BATCH_DATE 字段类型是date ,传入的参数 PI_DATE 字段类型也是date。两边的操作数都是这种结构化类型数据,所以是不能够自己进行比较的。(以下代码仅作举例子)

CREATE OR REPLACE PROCEDURE LOAD_FROM_EMP(
  IN PI_DATE DATE
  IN JOB_ID DECIMAL(10,0)
)
BEGIN
 DECLARE CNT_V INTEGER;
 DECLARE SQL_V VARCHAR(1000);

SET CNT_V = (SELECT COUNT(1) FROM EMP_FILE_LOG WHERE BATCH_DATE = PI_DATE );
IF CNT_V <> 0 THEN
    SQL_V = 'LOAD CLIENT FROM ''/LOADFILE/123.dat'' OF DEL MODIFIED BY ANYORDER coldel0x1b nochardel keepblanks usedefaults method p(1,2,3) REPLACE INTO EMP(EMPNO,EMPNAME,DEPTNO) STATISTICS YES AND INDEXES ALL NONRECOVERABLE DATA BUFFER 100000 '
    CALL SYSPROC.ADMIN_CMD(SQL_V)
END IF;

END;

处理方式

 对where 条件出进行修改:

where BATCH_DATE = to_char(PI_DATE, 'yyyy-MM-dd')

ps:跑存储过程,将重要环节的信息记录在一张表(日志表),方便定位问题,相当于存储过程的debug模式了


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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值