Хранимая процедура Oracle для возврата постраничного набора результатов - PullRequest
0 голосов
/ 23 июля 2010

Есть ли способ для хранимой процедуры Oracle возвращать постраничный набор результатов (как refcursor) обратно? Например, я хотел бы передать хранимой процедуре количество возвращаемых записей и интересующий номер страницы. Тогда я только хочу увидеть это количество записей на моем клиенте. Как это делается на стороне Oracle?

т.е.

var v_numrecords number := 30;
var v_pagenum number: = 5;
var v_rows refcursor;
exec my_stored_proc(:v_rows, :v_numrecords, :v_pagenum);
print v_rows;  -- expecting only 30 records of page number 5 back

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Если вы хотите, чтобы Oracle возвращал строки с N по M набора результатов, у вас есть несколько вариантов, в зависимости от того, что вы действительно хотите.

Если вы хотите, чтобы весь набор результатов был статическим - например, строки на странице 5 никогда не появятся на любой другой странице, вам придется либо:

  1. Открыть курсор для всего набора результатов и выполнить нумерацию страниц в приложении.

  2. Пусть хранимая процедура сохранит весь набор результатов в глобальной временной таблице и разбит на страницы. Это усложняет вашу хранимую процедуру, так как ей придется создавать набор результатов с нуля, когда приложение сообщает об этом.

Если вам не важно, что строки на странице 6 могли быть на странице 5 (результирующий набор является динамическим), тогда сделайте так, чтобы курсор выполнял обычную нумерацию страниц Oracle:

select [columns] 
  from (select [columns], rownum as rn
          from [some such tables]
         where [some such conditions]
           and rownum < (:v_pagenum + 1) * :v_numrecs
         order by [some expression])
 where rn >= :v_pagenum * :v_numrecs;
2 голосов
/ 23 июля 2010

Вы можете использовать ROWNUM. Вам нужно применить это после результаты были отсортированы.

Вот пример: нам нужны строки с 6 по 10.

   SELECT *
    FROM (SELECT e.*, ROWNUM rnum
          FROM (SELECT *
                FROM employee
                ORDER BY employee_id) e
          WHERE ROWNUM <= 10)
    WHERE rnum >= 6;

Чтобы получить записи со 121 по 150, вы должны заменить 10 во внутреннем SELECT 150, а затем заменить 6 в предложении WHERE на 121.

В вашей хранимой процедуре вы захотите заменить эти жестко запрограммированные значения переменными.

...