2015-07-10 81 views
1

你曾经在做过什么,找到一个更简单的方法来完成这个项目,但仍然想要第一种工作方式?PLSQL中循环

这就是我现在所处的位置。我想计算最近一个数字和前面的数字不相等的列中的实例数。我决定用一段时间来做这个。

例如,

4 
3 
2 
1 
1 
1 
0 
0 
0 

将在三个间隔返回3,如图4个减少到1。

4 
4 
3 
2 
1 
0 
0 

将返回0,因为4在最近的时间间隔中不减少。

我已经写

declare 
    cursor curr 
    is 
      select (YTDOVERDRAFTS - Previous_YTDOVERDRAFTS) colum 
      from (select LAG(YTDOVERDRAFTS,1,0) OVER (ORDER BY EFFDATE asc) As Previous_YTDOVERDRAFTS, 
      YTDOVERDRAFTS 
       from WH_ACCTDEPOSIT 
       where ACCTNBR = xxxxxxxxx 
       order by effdate desc); 
    Counter BINARY_INTEGER :=0; 
    readcurr curr%ROWTYPE; 
    status INTEGER; 
begin 
    open curr; 
    fetch curr into readcurr; 
    while readcurr.colum > 0 
    loop  
     Counter := Counter + 1; 
     dbms_output.put_line(Counter); 
     dbms_output.get_line(Counter, status); 
    end loop; 
    close curr; 
end; 

它运行,但不给输出它应该。我在做什么dbms_output语句错了?

+0

你不应该被重新获取'curr'内循环? – sstan

+0

为什么?一旦数据在光标中,为什么我需要重新读取它? – joel

+1

您的查询不会返回多行吗?你需要为每一行“提取”,不是吗? – sstan

回答

0

看起来像一个单一的查询可以做到这一点,我修改您的查询请检查以下内容:

select sum((case when (YTDOVERDRAFTS - Previous_YTDOVERDRAFTS) <> 0 then 1 else 0 end)) non_equal_count 
     from (select LAG(YTDOVERDRAFTS,1,0) OVER (ORDER BY EFFDATE asc) As Previous_YTDOVERDRAFTS, 
     YTDOVERDRAFTS 
      from WH_ACCTDEPOSIT 
      where ACCTNBR = xxxxxxxxx); 
+0

我已经完成了项目,我真的只是想让循环工作,所以我可以给自己一个轻拍背部,说“好工作”。 – joel