【问题标题】:While loop counter in PLSQLPLSQL中的while循环计数器
【发布时间】:2015-09-13 19:48:39
【问题描述】:

我在写一段plsql代码,遇到了问题。

我要做的是计算列中最近的数字和前面的数字不相等的实例数,然后循环。例如,

4
3
2
1
1
1
0
0
0

将返回 3,因为 4 在三个间隔内减少为 1。

4
4
3
2
1 
0 
0

将返回 0,因为 4 在最近的时间间隔内没有减少。

到目前为止我已经写了

declare
   Counter BINARY_INTEGER :=1;
BEGIN
   while (select YTDOVERDRAFTS from (select YTDOVERDRAFTS
                 from WH_ACCTDEPOSIT
                 where ACCTNBR = xxxxxxxxxx
                 order by effdate desc)) <>
         (select Previous_YTDOVERDRAFTS from (select LAG(YTDOVERDRAFTS,1,0) 
OVER (ORDER BY EFFDATE asc) As Previous_YTDOVERDRAFTS
                 from WH_ACCTDEPOSIT
                 where ACCTNBR = xxxxxxxxxx
                 order by effdate desc))
         Counter := Counter + 1;
   END LOOP;
END;
/

这给了我这个错误

http://imgur.com/WXjXMXG.jpg

有人知道如何解决这个问题吗?

【问题讨论】:

  • 不要使用循环。请改用自联接。
  • 语法为:WHILE condition LOOP statements END LOOP;。我在您的代码中看不到LOOP 关键字,只有END LOOP。 docs.oracle.com/cd/E18283_01/appdev.112/e17126/…
  • 你能举个例子说明我在这种情况下如何使用自联接吗?

标签: sql loops plsql while-loop


【解决方案1】:

这是如何编写自连接的。现在把它放在 sql fiddle 中,这样你就可以玩它了:

select min(rnb) from (
select * from (
    select YTDOVERDRAFTS, acctnbr acctnbra, effdate, row_number() over (partition by acctnbr order by effdate desc) rna
                     from WH_ACCTDEPOSIT) a
                    left join 
             (select acctnbr acctnbrb, Previous_YTDOVERDRAFTS, row_number() over (partition by acctnbr order by effdate desc) rnb from (select effdate, acctnbr, LAG(YTDOVERDRAFTS,1,0) 
    OVER (ORDER BY EFFDATE asc) As Previous_YTDOVERDRAFTS
                from WH_ACCTDEPOSIT
                ) x
            ) b on a.ACCTNBRa = b.ACCTNBRb and a.rna  = b.rnb        

        ) c
    where ytdoverdrafts -1 <> Previous_YTDOVERDRAFTS

这里的 SQL 小提琴:http://sqlfiddle.com/#!3/cf436/4

【讨论】:

  • 在“)b”之后和“on b.acctnbr”之前出现“缺少右括号”错误
  • 现在用 sql fiddle 修复它
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 2015-04-07
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多