منبع اصلی نوشتار زیر در این لینک قرار دارد

rowid و rownum در اوراکل

rowid و rownum شبه ستونی هایی در هر جدول از پایگاه داده اوراکل هستند و در خروجی دستور description نشان داده نمی شوند. دستور description از SQL*PLUS ستون ها و نوع آنها را از هر جدول نشان می دهد و به صورت description TABLE_NAME یا desc TABLE_NAME استفاده می شود. پیش از معرفی این دو شبه ستون چندین سوال را مطرح می کنیم.چگونه تعداد سطر های بازگشتی از یک پرس و جو را محدود کنیم؟

چگونه پرس و جویی برای بدست آوردن 10 تا بیشترین حقوق از جدول کارمندان بنویسیم؟

چگونه میان دو سطر یکسان تفاوت و تمایز قایل شویم؟

چگونه راهی برای بدست آوردن سطر مورد پرس و جو پیدا کنیم؟

پاسخ این پرسش ها در استفاده از دو شبه ستون rowid و rownum است. در ادامه این دو شبه سطر و کاربرد آنها توضیح داده خواهد شد. البته هر جدول به جز این دو شبه سطر چندین شبه سطر دیگر نیز دارند.

ROWID Pseudocolumn

برای هر سطر در پایگاه داده شبه ستون rowid آدرس سطر را برمی گرداند. rowid شامل اطلاعاتی برای پیدا کردن سطر در پایگاه داده است مانند بلاک داده ای در Datafile که در آن سطر قرار دارد. موقعیت سطر در بلاک داده که نخستین سطر موقعیت صفر را دارد. datafile ای که سطر در آن ساکن است. rowid در یک جدول منحصر به فرد است پس از این رو می توان میان دو سطر یکسان تمایز قایل شد. اما ممکن است که rowid سطر های دو جدول که با هم در یک کلاستر (همسان) ذخیره شده اند یکسان باشند.

نوع داده شبه ستون rowid از نوع ROWID یا UROWID است. مقدار rowid دارای مزیت هایی مانند زیر است :

  1. راهی سریعتر برای دسترسی به تنها یک سطر.
  2. چگونگی ذخیره شدن سطر در جدول را نشان می دهد.
  3. شناسه ای منحصر به فرد برای سطر ها در جدول هستند.

توجه کنید که rowid را نباید به عنوان ستون PRIMARY KEY در جدول استفاده کنید.برای مثال در صورتی که با ابزار های export و import سطر را مجدد درج کنید انگاه یک rowid جدید به سطر داده خواهد شد. همچنین اگر سطر را پاک کنید اوراکل ممکن است rowid آنرا به سطر جدید که درج شده اختصاص دهد.

می توانید با دستور SELECT …. WHERE برای نمایش rowid هر سطر استفاده کنید. شبه مقدار های ستون های rowid واقعا در پایگاه داده ذخیره نمی شوند. امکان درج و حذف و بروز کردن شبه ستون rowid وجود ندارد.

;SELECT rowid FROM hr.employees WHERE department_id = 20

OUTPUT

ROWID
——————
AAAR5pAAFAAAADPABa

ROWNUM Pseudocolumn

برای هر سطر بازگشتی توسط پرس و جوی اجرا شده rownum بر ترتیبی که سطر از از جدول select شده است دلالت می کند. اولین سطر بازگشتی (اولین سطر select شده) شماره یک و دومین سطر شماره دو و الی آخر.

;SELECT rownum FROM hr.employees WHERE department_id = 20

می توانید از rownum برای محدود کردن تعداد سطر های بازگشتی استفاده کنید. پرس و جوی زیر تنها 9 سطر نخست از سطر های بازگشتی را نشان می دهد.

;SELECT first_name, last_name FROM hr.employees WHERE rownum < 10

OUTPUT

FIRST_NAME         LAST_NAME
——————– ————————-
Ellen             Abel
Sundar             Ande
Mozhe             Atkinson
David             Austin
Hermann          Baer
Shelli             Baida
Amit             Banda
Elizabeth         Bates
Sarah             Bell

;SELECT first_name, last_name FROM hr.employees WHERE rownum < 10 ORDER BY 2,1

یک کاربرد اساسی ستون rownum پیاده سازی عملکرد دستور TOP در دیگر پایگاه داده ها است. به طور مثال برای بدست آوردن 10 نفری که بیشترین حقوق را دارند از دستور زیر استفاده کنید.

) SELECT first_name, last_name, salary FROM

(SELECT * FROM hr.employees ORDER BY salary DESC

;WHERE rownum < 11

select تو در تو داریم. select درونی (آبی رنگ) نخست اجرا شده و فهرستی از تمامی کارمندان بر اساس ترتیب نزولی به نحوی که بالاترین دستمزد در ابتدا و کمترین دستمزد در انتهای فهرست قرار می گیرند (به دلیل استفاده از DESC). سپس select بیرونی (قرمز رنگ) با شرط rownum < 11 نام و نام خانوادگی ده نفری که بالاترین قیمت را دارند را نشان می دهد.

rownum

اگر می خواهید ده نفری که کمترین حقوق را دریافت می کنند دیگر DESC را استفاده نکنید. در این حالت به طور پیشفرض خروجی select درونی به صورت صعودی بوده به نحوی که کمترین قیمت در بالا و بیشترین قیمت در پایین فهرست قرار می گیرد. (برای صعودی بودن می توانید از ASC نیز استفاده کنید که اگر ASC یا DESC را ننویسید به طور پیشفرض ASC در نظر گرفته می شود)



برچسب ها : , , ,