2008-10-06 7 views
1

Кто-нибудь есть идеи, как сделать следующее?Oracle Cursor Issue

объявить курсор открытый курсор выборки курсора < < Начало чтения курсор в LOOP >> Допустим, курсор имеет 10 записей. Прочитайте до 5-й записи, затем перейдите к шестой записи и выполните некоторую проверку.

Теперь, возможно ли вернуться к 5-й записи с 6-й записи?

ответ

0

Как далеко вам нужно вернуться? Если вам нужно только взглянуть на одну строку, вы можете буферизировать только предыдущую строку в своем цикле (на стороне приложения).

9

В зависимости от требований.

Вы можете использовать LAG() и LEAD() аналитические функции, чтобы получить информацию для последующих и предыдущих строк, то есть

SQL> ed 
Wrote file afiedt.buf 

    1 select ename, 
    2   sal, 
    3   lead(sal) over (order by ename) next_sal, 
    4   lag(sal) over (order by ename) prior_sal 
    5 from emp 
    6* order by ename 
SQL>/

ENAME    SAL NEXT_SAL PRIOR_SAL 
---------- ---------- ---------- ---------- 
ADAMS   1100  1600 
ALLEN   1600  2850  1100 
BLAKE   2850  2450  1600 
CLARK   2450  3000  2850 
FORD    3000  950  2450 
JAMES    950  2975  3000 
JONES   2975  5000  950 
KING    5000  1250  2975 
MARTIN   1250  1300  5000 
MILLER   1300  3000  1250 
SCOTT   3000  800  1300 

ENAME    SAL NEXT_SAL PRIOR_SAL 
---------- ---------- ---------- ---------- 
SMITH    800  1500  3000 
TURNER   1500  1250  800 
WARD    1250     1500 

14 rows selected. 

Если вы не хотите использовать аналитические функции, вы можете использовать PL/SQL, BULK СОБИРАЙТЕ данные в эти коллекции (используя предложение LIMIT, если у вас есть больше данных, чем вы хотите сохранить в PGA), а затем перемещайтесь вперед и назад через свои коллекции.

+0

+1, особенно для использования аналитики для логики предыдущей строки. – 2008-10-06 12:19:47