游标中的前一行 oracle
Posted
技术标签:
【中文标题】游标中的前一行 oracle【英文标题】:previous row oracle in cursor 【发布时间】:2014-07-22 16:56:42 【问题描述】:我在这里是因为如果有办法返回循环中的前一个值(光标)以与当前值进行比较,我无法找到其他任何地方,例如..
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)
我的问候。
【问题讨论】:
你的代码和光标是什么?为什么不只选择 DISTINCT 记录? 我不确定您的编辑是否澄清了任何事情。我猜你的伪代码是什么意思,但看起来你仍然在谈论想要使用lag
函数。但是你说这不是你感兴趣的,所以我有点困惑。如果您发布实际代码、示例数据、预期输出等,也许会更清楚。
这是因为所有的过程都发生在一个 for FOR cisiOrder IN cGetCISINewOrders LOOP
这是我的光标 cGetCISINewOrders
是从这里我拿走了我所有的 order_numbers
【参考方案1】:
你不能向后引用。最简单的替代方法是将键值 (contract_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;
【讨论】:
好吧,我一直在尝试使用来自光标的向后信息来执行此操作,因为我们不能哈哈,我会按照你的提示进行操作,谢谢@TenG 的帮助【参考方案2】:不完全清楚你在问什么。
游标是只进的结构。您不能获取前一行,只能获取下一行(或一组行)。但是,您的查询当然可以使用 lag
函数包含来自先前行的数据。例如,这将向您显示结果中前一行的ename
SELECT empno, ename, lag(ename) over (order by empno) prior_ename
FROM emp
ORDER BY empno
在 PL/SQL 循环中,您显然还可以有一个局部变量,其中包含已提取的前一行数据,并使用该变量与最新行的数据进行比较。
【讨论】:
嗯,这不是我想要的,但我可以想办法解决吗,谢谢 @YuriAguirre - 如果这不是您要问的,请随时编辑您的问题以澄清您要问的是什么。 我已经编辑了我的问题,现在你可能会更容易弄清楚,对不起我的错误解释【参考方案3】:请使用分析功能检查之前或之后的行。 LEAD,LAG 函数是最好的方法。
【讨论】:
以上是关于游标中的前一行 oracle的主要内容,如果未能解决你的问题,请参考以下文章