Catatan Kecil Oracle “rownum” #2

Limit query dengan menggunakan rownum memang sukses untuk membatasi berapa banyak record yang ingin dikembalikan, tapi hari ini aku perlu limit untuk membatasi result setelah record XX dan sampai record XX.

Aku kira dengan menambahkan batasan bawah rownum yang ingin dikembalikan menjadi:

SELECT rownum row2, b.row1, b.k_agama, b.content
FROM
(
  SELECT rownum row1, a.k_agama, a.content FROM m_agama a ORDER BY a.content
) b
WHERE 5 <= rownum AND rownum <= 10;

bisa digunakan, akan tetapi hal itu tidak sesuai dengan yang aku inginkan. Query tersebut gagal. Tidak ada record yang dikembalikan.

Quick workaround adalah dengan mengubahnya menjadi seperti ini:

SELECT c.row2, c.row1, c.k_agama, c.content
FROM
(
  SELECT rownum row2, b.row1, b.k_agama, b.content
  FROM
  (
    SELECT rownum row1, a.k_agama, a.content FROM m_agama a ORDER BY a.content
  ) b
) c
WHERE 5 <= rownum AND rownum <= 10;

Aku tahu workaround ini payah, tapi aku butuh query ini berjalan secepatnya.

Catatan Kecil Oracle “rownum”

-- rownum menunjukkan urutan fisik dari record
-- dalam database
SELECT rownum row1, a.k_agama, a.content FROM m_agama a;

-- jika kita order hasil query maka rownum tidak lagi akan urut
-- karena rownum menunjukkan posisi asli dari record
SELECT rownum row1, a.k_agama, a.content FROM m_agama a ORDER BY a.content;

-- jika query model ini diterapkan limit hasil query (emulasi LIMIT)
-- maka akan dihasilkan hasil yang salah
SELECT rownum row1, a.k_agama, a.content FROM m_agama a WHERE rownum <= 5 ORDER BY a.content;

-- dengan multi select maka bisa didapatkan urutan dari query
-- yang menggunakan order
SELECT rownum row2, b.row1, b.k_agama, b.content
FROM
(
SELECT rownum row1, a.k_agama, a.content FROM m_agama a ORDER BY a.content
) b;

-- dengan menggunakan model query terakhir maka bisa diperoleh record yang
-- dibutuhkan (implementasi query LIMIT seperti di mysql)
SELECT rownum row2, b.row1, b.k_agama, b.content
FROM
(
SELECT rownum row1, a.k_agama, a.content FROM m_agama a ORDER BY a.content
) b
WHERE rownum <= 5;

Betapa bodoh aku!

Lusa, aku convert salah satu class untuk menggunakan query, sebelumnya class itu menggunakan wrapper untuk mendapatkan data. Convert selesai, ketika dicoba terjadi kesalahan. Data tidak keluar. Dicek semuanya ok, query seperti yang direncanakan. Tapi kok….

Setelah telusur punya telusur ternyata aku kurang menambahkan “,” pada query. Ok… aku mengakuinya, aku kurang teliti…. Query awal berjalan dengan baik…

Query kedua… Gagal… loh? knapa lagi dengan query ini…. dicek semua ok, tapi …. oh my god! kurang “,” lagi…. berikutnya… sama… yang lain kurang “and”. Wadoww….. knapa seh aku…

Busuk!!!!! kok bisa seh aku lupa kasih “,”, “and” dan sebagainya…. akibat dari itu aku kehilangan jam-jam coding aku hanya untuk mencari kesalahan query itu. Mencarinya juga gak semudah membalik tangan. Karena hasil query di ubah ke JSON dan dikirim ke client jadi pesan kesalahan query diabaikan, dan memberikan silent error…. sial…

Point yang ingin aku tekankan adalah, aku udah berulang-ulang kali buat query, masak gak tau kalo query itu kurang “,” atau “where”-nya kurang “and” sebagai penghubung…. Kalau saja aku bisa tahu itu lebih awal, gak perlu aku susah-susah dan berpusing-pusing ria lihat query jalan tapi data tidak keluar…

But look at good side, emang ada… :D … next time harus lebih teliti kalau mengubah query jangan asal comot, kalau tidak mau berjam-jam melototin query yang “sepertinya” benar.

Have a nice coding!