Rownum вычисляется после того, как набор результатов будет возвращен, поэтому не поможет со скриптом разбиения на страницы, так как если вы хотите, чтобы строки из внутреннего запроса возвращались как строки 10-20 в полном запросе, он будет сброшен и начнется с 1.
Вместо этого попробуйте использовать аналитический запрос с ROW_NUMBER (), например так:
SELECT * FROM
(SELECT BILL_NO,
AK_NO,
PAT_NAME,
VOUCHER_DATE,
USER_NAME,
PAYMENT_AMT,
ROW_NUMBER() OVER (ORDER BY VOUCHER_DATE ASC) RN
FROM patients
WHERE VOUCHER_DATE >='01-Sep-2011'
AND VOUCHER_DATE <='26-Sep-2011'
AND SOURCE_LOCATION='KIAMBU CLINIC'
ORDER BY VOUCHER_DATE)
WHERE RN BETWEEN 10 and 20;
С точки зрения производительности, вышеприведенное не очень хорошо, потому что оно попадет на сервер базы данных и запросит полныйнабор результатов каждый раз, так что, может быть, лучше, если вы сможете выполнить запрос, чтобы получить данные только один раз, а затем использовать PHP для программного просмотра набора результатов с использованием прямых / обратных ссылок.
Чтобы попробовать это, посмотритев этом сценарии разбивки на страницы php (хотя он и не работает в mysql, он должен дать вам отправную точку для написания чего-то подобного с использованием Oracle, которое не вызывает проблем с производительностью)
//Include the PS_Pagination class
include('ps_pagination.php');
//Connect to mysql db
$conn = mysql_connect('localhost','root','');
mysql_select_db('yourdatabase',$conn);
$sql = 'SELECT post_title FROM wp_posts WHERE post_type="post" ORDER BY ID DESC';
//Create a PS_Pagination object
$pager = new PS_Pagination($conn,$sql,10,10);
//The paginate() function returns a mysql result set
$rs = $pager->paginate();
while($row = mysql_fetch_assoc($rs)) {
echo $row['post_title'],"\n";
}
//Display the full navigation in one go
echo $pager->renderFullNav();