Pagination-part1.  ANSI-standard OFFSET clause

Pagination-part1. ANSI-standard OFFSET clause

Pagination(Səhifələşdirmə)- sorğunun nəticəsində qaytarılan məlumatların ayı-ayrı səhifələrə bölünməsidir. Diskret səhifələrin nömrələnməsində hər səhifədə net sayda(deyək ki, N sayda) sətr məlumat əks olunur: Əgər N 20-dirsə, onda 1-ci səhifə özündə 1-20 arası sətirləri, 2-ci və ya "Növbəti" düyməsini sıxdıqda əks olunan səhifədə 21-40 arası sətirləri əks etdirəcəkdir. Oracle -da bir neçə sayda səhifələşdirmə yolları mövcuddur. Onlardan biri ANSİ standartlarına cavab verən OFFSET ifadəsidir. Bunu Oracle 12 -ci versiyadan başlayaraq istifadə etmək olar. Baxmayaraq ki, bütün məlumat bazalarında bu ifadə əlavə olunub, ancaq bir çoxları bunu pagination məsələsində istifadə etməməyi tövsüyyə edirlər. Buna baxmayaraq stackoferflow və s. kimi mənbələrdə pagination -nın həll yolu kimi təəssüf ki, daha çox OFFSET-i göstərirlər. Bu ifadənin necə işlədiyini bilməyib həll yolunu offset istifadə etməkdə gördükdə sorğularımızın hər zaman bizə doğru məlumatları qaytaracağına əmin ola bilmərik. Hansı halda səhv nəticə ilə üşləzə bilərik, misal üzərində buna aydınlıq gətirək: Hər hansı mənbələrdən sistemə daxil olan mesajları Oracle məlumat bazasında "messages" cədvəlində saxlayırıq. Bu mesajları vizual görmək üçün hər hansı bir user interface-də pagination elementi yaratmışıq. Burada məlumatlar əks sırada yəni ilk yeni daxil olanlar daha sonra isə daha əvvəl daxil olan mesajlar əks olunur. Pagination elementində adiyatı səhifələrdə məlumatların əks olunması üçün hər zaman məlumat bazasına SQL sorğu göndərilməlidir. Hər göndərilən sorğuda səhifənin nömrəsi və neçə sayda sətir əks olucaqsa həmin sətr sayı əks olunmalıdır. (Şəkillər xırda düşüb :( , şəkilləri aydın görmək üçün CTRL + = ilə səhifəni böyüdə bilərsiniz)

1.png

Şəkildə solda aşağıda messages cədvəlində olan bütün məlumatlar tərsinə(yenidən-köhnəyə) əks olunub.Buradakı qırmızı çərçivədə ilk səhifə üçün cədvəldən seçiləcək məlumatlar işarələnib. Sağda yuxarıda ilk qırmızı çərçivədə hal hazırda hansı səhifədə məlumatlar əks olunmalıdırsa, bu haqda cari əmr(1-ci səhifə qeyd olunub) qeyd olunub. Sağda aşağıda sorğunun nəticəsi qırmızı çərçivəyə işarələnibdir. Nəticə olaraq sol və sağdakı məlumatları tutuşdursaq 1-ci səhifə üçün sorğunun doğru nəticəni qaytardığını görərik. 2-ci səhifə üçün məlumatları almağa çalışaq:

2.png

2-ci səhifə üçün də sorğu bizə doğru məlumatları qaytardı. Bu yanaşmanı dövru təkrar etsək doğru cavabı almış olacağıq, yanlız bir şərtlə. Əgər sorğu icra edilən zaman cədvələ yeni məlumat daxil olmazsa.

Hər iki şəkildə sol tərəfdəki qırmızı çərçivəyə fikir versək, çərçivənin sanki hər dəfə bir az aşağı sürüşdüyünu görərik. Offset- axırıncı sürüşmədə hansı yerdə olduğunu özündə qeyd etmir. Məhz bu səbəbdən cədvələ yeni məlumatın daxil olan zaman offset bizə yanlış nəticə qaytarmağa başlayır. İlk olaraq növbəti şəkildə 3-cü səhifədə biz hansı sətirləri almalı olduğumuzu nəzər salaq:

3.png

messages cədvəlinə yeni məlumat daxil edək:

4.png

3-cü səhifə üzrə məlumatları almağı çalışaq. Yuxarıdakı şəkildə qeyd olunduğu kimi 3-cü səhifədə hansı məlumatların əks olunmalı olduğunu unutmayaq

5.png Cədvələ yeni daxil olunan məlumatdan sonra sorğu bizə 3-cü səhifə üçün 1-ci sətirdə İD si 16 olan məlumatı birinci yerdə əks etdirdi(2-ci səhifədə qaytardığı sətri təkrar olaraq bir daha qaytardı) Ancaq biz ilk sətirdə İD si 15 olan məlumatı sorğudan cavab olaraq göləyirdik. Baxmayaraq ki, bu halda biz yalnız bir sətir üzrə yanlışlıqla qarşılaşdıq, əgər cədvəldə məlumatların əlavə olunması tezliyi 1 san-də 5 sətir olarsa biz hər növbəti sətir üçün eyni 5 sayda dəyişməyən məlumatı görəcəyik.Bu səbəbdən offsetin buna oxşar məsələlərdə, sorğularda istifadəsi tövsiyyə edilmir.