DB2动态SQL:能否将带标记的查询放入VALUES/INTO中?
问题解答
1. 能否使用VALUES/INTO结构实现需求?
不行。IBM i的DB2 SQL不支持将完整的SELECT查询嵌套到VALUES子句中配合INTO使用。VALUES子句仅适用于定义单值、常量集合或简单表达式,无法承载返回多列(哪怕是单行)的SELECT查询逻辑,所以你设想的VALUES(查询) INTO ?,?,?形式无法实现。
2. 是否需要使用游标?
不需要。你的查询通过WHERE ID = ?和GROUP BY ID限制后,只会返回单行结果,这种场景下完全不需要游标,用EXECUTE INTO即可实现宿主变量的赋值。
3. 原代码的问题及修正方案
原代码的核心错误是将INTO :GroupDS写入了动态SQL字符串中——动态SQL的PREPARE阶段不能包含宿主变量的INTO子句,宿主变量绑定需要在EXECUTE阶段处理。
修正后的代码示例:
DCL-DS GroupDS; wGrpSOAId Packed(7:0); wAttach Packed(7:0); wNotAttach Packed(7:0); End-Ds; wFrom1 = 'FROM TBL1.ADD'; // 构建动态SQL时移除INTO子句 wSQL1 = 'SELECT ID, ' + ' sum(Case when status=''A'' then 1 else 0 end), ' + ' sum(Case when status=''R'' then 1 else 0 end) ' + %Trim(wFrom1) + ' WHERE ID = ? ' + ' GROUP BY ID'; Exec Sql prepare @GrpSql from :wSQL1; // 在EXECUTE语句中添加INTO绑定宿主变量 Exec Sql Execute @GrpSql into :GroupDS using :wID;
如果后续需求变更,查询可能返回多行结果,此时才需要使用游标来循环读取结果集。
内容的提问来源于stack exchange,提问作者lmk1234
相关产品推荐
相关产品推荐

