【发布时间】:2017-09-18 18:10:53
【问题描述】:
我目前正在实现一个 PL/SQL 过程,它可以平衡两个列表中的值。
将此示例视为背景:
- Rec_1 | 2
- Rec_2 | 1
- Rec_3 | 2
- Rec_A | -1
- Rec_B | -3
- Rec_C | -2
我想逐个循环遍历所有这些值并尽可能多地结算,即第一次结算后 Rec_1 应该是 1,Rec_A 应该是 0。之后,Rec_1 将与 Rec_B 结算,这样它得到 1,Rec_B 得到 -2,以此类推。
我想使用两个游标来执行此操作,并在它自己的过程(或函数,如果有必要的话)中更新值,因为除了更新这个值之外,还有更多工作要做。
现在,这是我的挑战: 在结算发生后,我如何知道要获取哪个光标?
现在,我的这个函数的代码如下所示:
PROCEDURE SettleLists (
ListNegV SYS_REFCURSOR,
ListPosV SYS_REFCURSOR
) IS
currentNegV TABLENAME%ROWTYPE;
currentPosV TABLENAME%ROWTYPE;
BEGIN
FETCH ListNegV INTO currentNegV;
FETCH ListPosV INTO currentPosV;
LOOP
EXIT WHEN ListNegV%NOTFOUND;
EXIT WHEN ListPosV%NOTFOUND;
IF (currentNegV.NUMERICVALUE < 0)
THEN
IF (currentPosV.NUMERICVALUE > 0)
THEN
Settle(currentPosV, currentNegV);
ELSE
FETCH ListPosV INTO currentPosV;
END IF;
ELSE
FETCH ListNegV INTO currentNegV;
END IF;
END LOOP;
END;
在结算过程中,两条记录都会有更新。由于变量和游标值没有更新,这将产生一个无限循环。我也可以在数据库中更新记录时更新结算参数,但由于我不习惯游标,您可能会有更好的主意。
我可以认为光标是强类型的,如果这有什么不同的话。如果有比使用光标更好的方法,请随时提出建议。
最后,我在玩 SELECT FOR UPDATE 和 UPDATE WHERE CURRENT OF,但在将游标传递给介于两者之间的过程时,它似乎不起作用。如果有人对此有一些想法,我也将感谢您的帮助。
【问题讨论】:
标签: loops if-statement plsql sql-update cursor