2010-07-23 3 views
0

Есть ли способ для хранимой процедуры Oracle возвращать выгруженный набор результатов (как refcursor)? Например, я хотел бы передать хранимой процедуре количество возвращаемых записей и интересующий номер страницы. Затем я хочу только посмотреть, какое количество записей возвращается моему клиенту. Как это делается на стороне Oracle?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

Вы можете использовать Вам необходимо подать заявление, что после результаты были отсортированы.

Вот пример: мы хотим, чтобы на строки с 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 на внутренней ВЫБРАТЬ с 150, а затем заменить 6 в ИНЕКЕ с 121.

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

2

Если вы хотите, чтобы 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; 
Смежные вопросы