IBM i V7R3M0用QSYS2.IFS_WRITE写JSON到IFS报SQL7032如何解决
问题原因分析
- 你使用的
JSON_OBJECT、JSON_ARRAYAGG函数返回的是原生JSON类型,未显式转换为字符类型,而QSYS2.IFS_WRITE的LINE参数仅支持字符类型输入,V7R3版本的SQL预编译不支持该场景下的隐式类型转换,导致编译失败。 - 你使用了聚合函数
JSON_ARRAYAGG但未加GROUP BY,整个查询仅会返回1行结果,使用FOR循环属于多余逻辑,也会触发V7R3的SQL预编译检测异常。
可行修改方案
由于聚合查询仅返回1行结果,你可以直接省略FOR循环,单步完成JSON生成、类型转换和IFS写入,修改后代码如下:
BEGIN CALL QSYS2.IFS_WRITE( PATH_NAME => '/myIFSdir/testout.json', LINE => CAST( json_object('top' value ( json_arrayagg(json_object ('number' value btbnbr)) ) AS CLOB(2M) CCSID 1208), -- 显式将JSON类型转换为UTF8字符类型 OVERWRITE => 'REPLACE', END_OF_LINE => 'NONE', FILE_CCSID => 1208 ); END;
如果后续需要处理多组聚合结果、必须使用FOR循环的场景,只需要在SELECT子句中对JSON结果增加显式类型转换即可:
BEGIN CALL QSYS2.IFS_WRITE( PATH_NAME =>'/myIFSdir/testout.json', LINE => '', OVERWRITE => 'REPLACE', END_OF_LINE => 'NONE', FILE_CCSID => 1208 ); FOR select CAST( json_object('top' value (json_arrayagg(json_object ('number' value btbnbr)))) AS VARCHAR(32000) CCSID 1208 as a from gldbfa/glpbt where btbnbr in (241858, 241934, 241983, 242534, 242538, 242657, 242708, 242717, 242723) DO CALL QSYS2.IFS_WRITE( PATH_NAME => '/myIFSdir/testout.json', LINE => a, FILE_CCSID => 1208 ); END FOR; END;
补充验证步骤
如果修改后仍报错,可按照报错提示将语句临时封装为存储过程,获取详细编译日志定位问题:
CREATE OR REPLACE PROCEDURE TEST_JSON_WRITE() LANGUAGE SQL SET OPTION OUTPUT=*PRINT BEGIN -- 此处填入你要测试的业务语句 END;
创建存储过程后到QSYSPRT假脱机文件中即可查看完整的编译错误详情。
内容的提问来源于stack exchange,提问作者Joe Molnar
相关产品推荐
相关产品推荐

