DB2 中具有 Bit/hex 混淆的字符

Character with Bit/hex confusion in DB2

这个有效:

SELECT TASKT_ID FROM DATA . TASKT WHERE TASK_WEB_IDENTIFIER = CAST ( HEXTORAW ( '0213725501A421D384233E5001' ) AS CHAR ( 26 ) ) ;

自那项工作以来,我将其放入程序中:

BEGIN

DECLARE GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER_C1 CURSOR WITH RETURN FOR
SELECT TASKT_ID FROM DATA . TASKT WHERE TASK_WEB_IDENTIFIER = CAST ( HEXTORAW ( P_WEB_IDENTIFIER ) AS CHAR ( 26 ) ) ;

OPEN GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER_C1 ;
END 

该过程有一个参数 P_WEB_IDENTIFIER,它是一个 CHAR(26) 位数据,CCSID 为 65535

但是,当我现在用这样的字符串调用它时:

call PROGRAM . GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER ('0213725501A421D384233E5001');

我发现 VARBINARY_FUNCTION 的参数在长度或数据类型上无效。

此外,这有效:

call PROGRAM . GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER (CAST('0213725501A421D384233E5001' as char(26)));

我怎样做才能确保字符串仅通过传递的字符串进行转换?

你用什么调用存储过程?

Db2 for i 的版本和发行版是什么?

在 IBM ACS 的 运行 SQL Scripts 组件或 Windows 的旧版 Access 中,语句中的字符串文字被处理作为 varchar.

因此 CAST('0213725501A421D384233E5001' as char(26)) 是有道理的。没有的是错误消息。通常,你会得到一个 procedure not found 错误,因为 Db 正在寻找一个名为 PROGRAM.GET_TASKT_ID_BY_TASK_WEB_IDENTIFIER 的过程,它接受一个 varchar 参数,唯一存在的是一个过程接受一个 char(26).

IBM 的工具在需要时隐式转换方面做得更好。但是我通常在手动测试时进行显式转换(正如您在此处所做的那样)。或者我只是让 parms varchar 开始。并在需要时在过程中转换为字符。

char/varchar 差异通常对客户端代码无关紧要,因为它可以在其类型定义中具体说明。对于像 ACS 这样执行动态语句的交互式工具来说,这只是一个因素。