2015-06-26 2 views
-1

Я пишу часть кода plsql и столкнулся с проблемой.Хотя счетчик циклов в 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

ли кто-нибудь знает, как решить эту проблему?

+2

Не используйте цикл. Вместо этого используйте самостоятельное соединение. –

+1

Синтаксис: 'WHILE condition LOOP statement END LOOP;'. Я не вижу ключевого слова LOOP в вашем коде, есть только 'END LOOP'. http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/while_loop_statement.htm – krokodilko

+0

Можете ли вы дать мне пример того, как я буду использовать самостоятельное присоединение в этом контексте? – joel

ответ

0

Это может быть написано как самостоятельное соединение. Собираем в SQL скрипку теперь так что вы можете играть с ним вокруг:

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

+0

Я получаю ошибку «Отсутствующие правые скобки» после «) b» и перед «on b.acctnbr» – joel

+0

Исправлено это теперь с скриптом sql –

Смежные вопросы