执行存储过程的时候碰到这个报错:
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有需要文档的同学也可以私信我~