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

Cursors در اوراکل چیست

cursor یا مکان نما یک ناحیه کاری موقتی ایجاد شده در حافظه سیستم است که برای پردازش بر روی دستور های SQL استفاده می شود. به طور مثال اطلاعاتی درباره دستور SELECT اجرا شده و سطر های داده ای که توسط دستور SELECT بدست آمده اند. یعنی یک ناحیه کاری موقتی ایجاد شده برای ذخیره سازی داده های بدست آمده از پایگاه داده را Cursor می گویند. Cursor می تواند بیش از یک سطر را در خود نگه دارد، اما در هر لحظه تنها می توان بر روی یک سطر پردازش انجام داد. مجموعه سطر های نگه داری شده در Cursor را active set می نامند.

دو نوع مکان نمای صریح (Explicit) و غیر صریح یا ضمنی (Implicit) وجود دارند. مکان نمای غیر صریح زمانی که یک دستور SQL اجرا می شود، به طور خودکار ایجاد خواد شد. دستور های DML مانند INSERT, UPDATE و DELETE زمانی که اجرا شوند، به طور خودکار مکان نمای غیر صریح ایجاد خواهد شد. برنامه نویس امکان مدیریت مکان نمای غیر صریح و اطلاعات درون آنرا ندارد. همچنین زمانی که دستور SELECT تنها یک سطر را بازیابی می کند، مکان نمای غیر صریح ایجاد خواهد شد. با اجرای هر کدام از دستورا DML و SELECT با بازیابی یک سطر، به طور خودکار یک مکان نما به آنها اختصاص داده می شود که برای دستور INSERT شامل داده هایی است که باید در جدول درج شود، برای دستور های UPDATE و DELETE سطر(هایی) را که باید تحت تاثیر دستور قرار گیرند را مشخص می کند و برای SELECT ای که تنها یک سطر را واکشی می کند، شامل داده های همان سطر است.

Cursor های اخیرا ایجاد شده در دارای خواصی مانند ROWCOUNT% یا FOUND% است که می توان به Cursor در برنامه یا بلاک PL/SQL به Cursor مراجعه کرد. خواص یا Attribute های یک مکان نما شامل موارد زیر است

  • صفت FOUND% : اگر یکی از دستور های INSERT, DELETE یا UPDATE بر روی یک یا چند سطر اثر گذاشته باشند یا یک دستور SELECT یک یا چند سطر را بازگرداند، مقدار TRUE را برگشت می دهد، در غیر این صورت مقدار FALSE برگشت داده می شود.
  • صفت NOTFOUND% : عکس صفت FOUND% است.
  • صفت ISOPEN% : همیشه برای مکان نمای غیر صریح مقدار FALSE با بر می گرداند. به این خاطر که اوراکل همیشه پس از اتمام اجرای دستور SQL مکان نمای غیر صریح را به طور خودکار Close می کند.
  • صفت ROWCOUNT% : تعداد سطرهایی را که تحت تاثیر دستور های DELETE, INSERT و یا UPDATE قرار گرفته اند یا توسط دستور SELECT بازگشت داده شده اند.

شکل کلی آنها به صورت زیر است :

cursor_name%ATTRIBUTE

به عنوان مثال قطعه بلاک PL/SQL زیر را در نظر بگیرید. در قطعه بلاک زیر حقوق (salaries) تمامی کارمندان درون جدول emplyee به روز (updated) می شود. اگر حقوق هیچ یک از کارمندان به روز نشود به این معنی است که هیچ سطری تحت تاثیر دستور UPDATE قرار نگرفته است، از این رو پیغام None of the salaries where updated نشان داده می شود. در غیر اینصورت می تواند پیغامی مانند Salaries for 1000 employees are updated نشان داده شود که این یعنی 1000 سطر از جدول employee به روز شده است (یعنی مقدار بازگشتی FOUND% برابر TRUE بوده است). مقدار 1000 سطر را از SQL%ROWCOUNT به دست آمده است که تعدادسطر های تحت تاثیر را نشان می دهد.

oracle_cursor

Cursor های صریح توسط برنامه نویس ایجاد می شوند و بر خلاف مکان نمای غیر صریح، قابلیت کنترل و مدیریت را بر روی فضای کاری موقتی به برنامه نویس می دهند. مکان نمای صریح توسط دستور CURSOR cursor_name و در قسمت declaration از بلاک PL/SQL و زمانی که دستور SELECT را اجرا می کنید که بیش از یک سطر را بر می گرداند ایجاد می شود. شکل کلی آن به صورت زیر است:

;CURSOR cursor_name IS SELECT STATEMENT

با اینکه چندین سطر در مکان نمای صریح نگه داری می شود، اما در هر لحظه تنها یکی از سطر ها می تواند پردازش شود که آنرا current row می نامند. وقتی سطری را واکشی می کنید، موقعیت سطر جاری یکی به جلو حرکت می کند. هر دوی مکان نماهای صریحو غیر صریح عملکرد مشابه ای را دارند، اما در روش چگونگی دستیابی به آنها از یکدیگر متفاوت هستند. کار با مکان نمای صریح چهار گام زیر را دربر می گیرد:

  • اعلان و تعریف مکان نما برای مقداردهی اولیه (initializing) کردن در حافظه.
  • بازکردن (Opening) مکان نما برای تخصیص حافظه.
  • بدست آوردن داده و قرار گرفتن در مکان نما.
  • بستن یا Close کردن مکان نما برای آزاد سازی حافظه. (توجه کنید مکان نمای غیر صریح به طور خودکار بسته خواهد شد)

دستور زیر نخستین گام یعنی تعریف مکان نما را نشان می دهد. یک مکان نما به نام c_customers که شامل چندین سطر واکشی شده از اجرای SELECT است را ایجاد می کند.

CURSOR c_customers IS

; SELECT id, name, address FROM customers

با دستورOPEN cursor_name  مکان نمار را باز می کنم تا حافظه به آن تخصیص داده شود و آنرا برای واکشی سطر های بازگشتی از دستور SELECT و قرار گرفتن درون آن، آماده می کند.  از این پس می توانیم در بلاک PL/SQL از اطلاعات (سطر های) ذخیره شده در مکان نما استفاده کنیم. دستور زیر مکان نمای ایجاد شده در بالا را باز می کند.

;OPEN c_customers

با دستور زیر داده ها و اطلاعات درون مکان نمای باز شده بالا را واکشی می کنیم و درون متغیر هایی قرار می دهیم. به طور مثال ما با SELECT بالا سه ستون را واکشی کردیم و داده های آنها را هر لحظه در سه متغیر به نام های c_id و c_name و c_addr قرار دادیم.

;FETCH c_customers INTO c_id, c_name, c_addr

ساختار کلی واکشی از مکان نما و قرار دادن درون متغیر ها به صورت زیر است.

;FETCH cursor_name INTO variable_list

و در آخرین گام و پس از واکشی با دستور زیر مکان نما با دستور CLOSE cursor_name بسته خواهد شد.

;CLOSE c_customers

شکل زیر یک مثال کلی را نشان می دهد. این بلاک سه متغیر را ابتدا تعریف می کند. این سه متغیر همان هایی هستند که داده ها باید از درون مکان نما به آنها واکشی شوند. توسط یه حلقه LOOP و تا زمانی که دیگر هیچ سطر دیگری واکشی نشود (که از طریق c_customers%notfound محاسبه می شود) داده های درون مکان نما و در هر لحظه یک سطر به درون متغیر ها ریخته شده و سپس توسط dbms_output.put_line چاپ می شوند.

oracle_cursor1

و می تواند خروجی مانند زیر داشته باشد.

oracle_cursor2

می توانید دو لینک زیر را نیز مطالعه کنید.



برچسب ها : ,