如何设置DB2 UDF返回结果的列长度以消除多余空格?
问题描述
首次编写DB2 UDF,DB2表中某列存储完整DL/I段(包含大量DL/I段字段),计划通过Rexx脚本生成SQL查询提取单个DL/I段字段。当前定义的LIFE_BIN_2_CHAR UDF返回VARCHAR(255)类型,即使仅需返回1个字符,结果后仍附带254个空格。已在COBOL联动段中设置out-len,但DB2仍按最大长度返回结果。尝试过LEFT、STRIP函数无效,且不想限制输入输出长度,求可行解决方案。
解决方案
- 正确赋值COBOL程序中的
out-len:DB2以out-len的实际取值作为返回VARCHAR的有效长度,而非仅依赖定义的最大长度。在COBOL逻辑中,必须根据实际需要返回的字符数给out-len赋值(比如返回1个字符时,将out-len设为1),不能仅定义变量却不赋值。 - 基于输入长度处理数据:利用输入参数的
in-len(即调用SUBSTR时传入的实际长度,如示例中的2),在COBOL中仅处理有效输入部分,避免对整个255位的输入参数做全量处理。 - 避免冗余空格填充:COBOL程序无需对
out-argument的全部255位填充空格,仅填充需要返回的有效字符即可,剩余位置无需处理,DB2会根据out-len自动截断多余内容。
相关代码示例
DB2 UDF创建语句
CREATE FUNCTION &COLLID..LIFE_BIN_2_CHAR *------------- ARGUMENTS: ( P_STRING VARCHAR(255) ) *------------- RESULT: RETURNS VARCHAR(255) PARAMETER STYLE DB2SQL *------------- OPTIONS: EXTERNAL NAME '&PGM' LANGUAGE COBOL DETERMINISTIC CALLED ON NULL INPUT NO EXTERNAL ACTION NO SCRATCHPAD NO FINAL CALL ALLOW PARALLEL NO DBINFO COLLID &COLLID WLM ENVIRONMENT &WLMENV STAY RESIDENT NO PROGRAM TYPE SUB SECURITY DB2
COBOL联动段代码
LINKAGE SECTION. * 01 input-argument. 05 in-len pic s9(4) comp. 05 in-argument pic x(255). * 01 output-argument. 05 out-len pic s9(4) comp. 05 out-argument pic x(255).
UDF调用示例
LIFE_BIN_2_CHAR(SUBSTR(DL1_SEGMENT1,017,002)) AS SORTKOD
内容的提问来源于stack exchange,提问作者Michael Simpson
相关产品推荐
相关产品推荐

