۲ مطلب با کلمه‌ی کلیدی «row_id» ثبت شده است

Fetching last record from a table

داشتم فکر می‌کردم که آیا راهی وجود داره که بشه آخرین رکورد از جدول رو بدست آورد. در این مورد مشخص و واضحه که از تعداد رکوردهای موجود در یک جدول بی اطلاع‌ام. فقط می‌خوام کوئری بنویسم که بتونه تمام ستون‌های آخرین رکورد رو بدست بیاره. من سعی کردم از ROWNUM استفاده کنم، اما حدس می‌زنم که شیوه‌ کار اینطور نیست. اگر یک گزارشی ایجاد کنم، می‌خوام که گزارش‌ام بر پایه‌ی کوئری باشه که به سادگی تمام ستون‌های آخرین رکورد رو بدست بیاره.

آیا دستوری وجود داره که بشه باهاش آخرین رکورد از جدول رو بدست آورد؟

با تشکر

حسن

 

تعریف تو از آخرین رکورد چیه؟

می‌دونی که آخرین رکورد درج شده در جدول می‌تونه اولین رکورد‌ی باشه که توسط “select * from t” بازگشت داده میشه یا ممکنه صدمی باشه، ممکنه هزارمی باشه، در واقع می‌تونه هر رکورد‌ای باشد.

یادت باشه رکوردها در هیچ ترتیب خاصی ذخیره و بازگردونی نمیشن.

ولی اگه آخرین رکورد درج شده را می‌خوای، باید یک فیلد timestamp یا sequence ای برای هر رکورد‌ای که درج می‌شه موقع درج رکورد مشخص کنی اینجوری «آخرین» رکورد رو میتونی داشته باشی یادت باشه این تنها راه است.

یادت باشه تنها راه برای انجام این کار اینه که ستونی داشته باشی که بتونی مرتبش کنی تا «آخرین» رکورد رو پیدا کنی.

 

ROWID و ROWNUM به دلایل زیر کار نمی‌کنند:

ROWID کار نمیکنه. چون داده‌اش بر پایه‌ی ترکیبی از شماره file/block/slot سرور فعلی است. یادت باشه ما از ROWID ها دوباره استفاده می‌کنیم، حتی می‌تونیم تغییرشون بدیم (مثلا با پارتیشن‌بندی جداول). پس ممکنه که Extent شماره‌ی 1 رو در فایل 55 و Extent شماره‌ی 2 رو در فایل 2 داشته باشید. Extent 4 حتی ممکنه در بلاک 555 از فایل 3 باشه، حتی ممکنه Extent 5 در بلاک 2 از فایل 3 باشه. ROWIDها قابل مرتب کردن نیستند.

 

ROWNUM هم کار نمیکنه چون یک ستون منطقیه(در جدول درج نشده) و با هر SELECT شماره ردیف رکوردهای SELECT مربوط رو برمیگردونه

منبع

۲۴ اسفند ۹۴ ، ۰۸:۳۷ ۰ نظر
مهدی غفاری

لیست تغییرات جدول توسط کاربران

س: لیست تغیراتی که کاربران بر روی جدول T1 داده‌اند را نمایش دهید:

ج: با استفاده از کوئری زیر می‌توانید به این هدف برسید.

SQL> select commit_timestamp , logon_user, XID from flashback_transaction_query
where table_NAME='T1';
COMMIT_TI LOGON_USER                     XID
--------- ------------------------------ ----------------
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 08001C00C6090000

گزارش بالا لیست commitهایی که کاربران رو سطح دیتابیس رو جدول t1 انجام داده‌اند.

نکته: این گزارش نمونه‌ای از اطلاعات دیتادیکشنری است. همچنین همانطور که مشاهده می‌کنید این گزارش از flashback_transaction_query گرفته شده است.

XID = شماره پیگیری transaction است.

نمایش لیست فیلدهای جدول flashback_transaction_query

SQL> describ flashback_transaction_query;
Name Null? Type
----------------------------------------- -------- -----------------
XID                                                 RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000)

نکته: اگر در حالت audit نباشید فیلد undo_sql, row_id اطلاعاتی در خود ندارد.

در حقیقت برای پیداکردن شماره تراکنش از این جدول استفاده می‌کنیم. بعداً توسط یک دیتادیکشنری دیگه می‌توانید شماره تراکنش را بدهید و دقیقاً بفهمید اون تراکنش ثبت شده در حقیقت چه کارهایی بر روی سطح دیتابیس انجام داده است.

۲۲ ارديبهشت ۹۴ ، ۱۷:۳۰ ۰ نظر
مهدی غفاری