遍历表每行多次调用存储过程仅返回单ID数据问题求解
代码问题排查
现有代码无法返回全量ID数据,核心问题有三个:
- FOR循环逻辑错误:每次循环把单个ID直接赋值给表类型变量
RES_TABLE,覆盖了原本应该存储全量ID列表的表变量 - 嵌套的WHILE循环无实际作用:每次进入循环都重新统计全量ID总数做递减,既没有逐行读取单个ID的逻辑,也没有存储每轮计算结果的逻辑
- 结果输出语句
SUSPEND被注释,存储过程无法向外返回逐行计算的结果
修正方案
正确执行逻辑如下:
- 先调用
GET_STRING_LIST将所有有序ID存入表变量RES_TABLE - 定义单值变量存储遍历过程中当前处理的单个ID,不要直接覆盖存储全量数据的表变量
- 对每个遍历到的单ID,分别调用
GET_VALUES获取两个系数对应的计算值 - 每处理完一个ID的计算逻辑,就通过
SUSPEND输出当前行结果,最终即可返回所有ID对应的数据
修正后代码
BEGIN -- 定义单值变量:存当前遍历ID、两个系数的计算结果,ID字段类型可根据实际业务调整 DECLARE VARIABLE CURRENT_ID VARCHAR(64); DECLARE VARIABLE NUMBER1 NUMERIC(18,2); DECLARE VARIABLE NUMBER2 NUMERIC(18,2); -- 初始化计算值变量 NUMBER1 = 0; NUMBER2 = 0; -- 先把全量有序ID存入RES_TABLE表变量 SELECT ID FROM GET_STRING_LIST(:VAR_ID) ORDER BY ID INTO :RES_TABLE; -- 逐行遍历RES_TABLE中的每个ID做计算 FOR SELECT ID FROM :RES_TABLE INTO :CURRENT_ID DO BEGIN -- 计算第一个系数对应的值 SELECT RES_VALUE FROM GET_VALUES(:CURRENT_ID, '%', 'SOME_STRING1', 7) INTO :NUMBER1; -- 计算第二个系数对应的值 SELECT RES_VALUE FROM GET_VALUES(:CURRENT_ID, '%', 'SOME_STRING2', 7) INTO :NUMBER2; -- 输出当前ID对应的计算结果,输出字段需和存储过程定义的返回字段一一对应 SUSPEND; END END
如果你的数据库版本不支持直接从表变量查询数据,可以直接遍历
GET_STRING_LIST返回的结果集,不需要先转存到RES_TABLE再遍历,调整后代码如下:
BEGIN DECLARE VARIABLE CURRENT_ID VARCHAR(64); DECLARE VARIABLE NUMBER1 NUMERIC(18,2); DECLARE VARIABLE NUMBER2 NUMERIC(18,2); NUMBER1 = 0; NUMBER2 = 0; FOR SELECT ID FROM GET_STRING_LIST(:VAR_ID) ORDER BY ID INTO :CURRENT_ID DO BEGIN -- 如果业务要求必须把全量ID存入RES_TABLE,可在此处增加单ID插入表变量的逻辑,匹配RES_TABLE的表结构即可 SELECT RES_VALUE FROM GET_VALUES(:CURRENT_ID, '%', 'SOME_STRING1', 7) INTO :NUMBER1; SELECT RES_VALUE FROM GET_VALUES(:CURRENT_ID, '%', 'SOME_STRING2', 7) INTO :NUMBER2; SUSPEND; END END
内容的提问来源于stack exchange,提问作者nemi
相关产品推荐
相关产品推荐

