游标中的前一行oracle

时间:2014-07-22 16:56:43

标签: oracle loops plsql cursor

我在这里,因为如果有办法在循环(Cursor)中返回先前的值以与当前值进行比较,我无法在其他任何地方找到它,例如..

  

Cursor.Value = Cursor-1.Value;

这是因为我需要通过邮件发送到商业部门的几个合同号码,但是,如果当前合同号码与上一个合同号码相同并且验证,则为了恢复我要比较的所有行它不发送重复的合同号码。

记录的例子我要跳过以便不发送重复的“订单号”:( Order_Number是我的密钥,而不是顺序数字ID):

  

cCursor.Value = cCursor-1.Value

     

cCursor。(111)= cCursor-1。(111)

我要保存的记录的例子,以便作为已处理的“订单号”发送:( Order_Number是我的密钥,而不是顺序数字ID):

  

cCursor.Value = cCursor-1.Value

     

cCursor。(132)= cCursor-1。(111)

我的问候。

3 个答案:

答案 0 :(得分:3)

你无法向后引用。最简单的替代方法是将键值(契约id)存储在变量中,并具有如下逻辑:

DECLARE
   CURSOR c1 IS .....;
   vLastContractID  NUMBER := 0;
BEGIN
   FOR r1 IN c1 LOOP
      IF vLastContractID != r1.CONTRACT_ID THEN
         -- do something
         vLastContractID := r1.CONTRACT_ID;
      END IF;
   END LOOP;
END;

答案 1 :(得分:2)

你的要求并不完全清楚。

游标是仅向前结构。您无法获取前一行,只能获取下一行(或一组行)。但是,您的查询当然可以使用lag函数包含先前行中的数据。例如,这会显示结果中前一行的ename

SELECT empno, ename, lag(ename) over (order by empno) prior_ename
  FROM emp
 ORDER BY empno

在PL / SQL循环中,您显然还可以拥有一个局部变量,该变量具有从上一行获取的数据,并使用该变量与最新行的数据进行比较。

答案 2 :(得分:0)

请使用ANALYTICAL函数检查先行或后续行。 LEAD,LAG功能是最好的方法。