ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

ارتباط بین سشن‌های اوراکل با DBMS_ALERT (آموزش کامل و عملی)

مقدمه : استفاده از پکیج DBMS_ALERT در اوراکل چه اهمیتی دارد؟

در پروژه‌های بزرگ دیتابیسی، نیاز به برقراری ارتباط سریع بین بخش‌های مختلف نرم‌افزار بسیار حیاتی است.

اوراکل این امکان را دیتابیس اوراکل از طریق پکیج DBMS_ALERT به ساده‌ترین و سریع‌ترین روش ممکن فراهم کرده است.

در این مقاله آموزش اوراکل قصد داریم به زبان ساده و کاملاً کاربردی یاد بگیریم که DBMS_ALERT چیست، چطور کار می‌کند و چطور می‌توانیم از آن در پروژه‌های واقعی استفاده کنیم.

همراه ما باشید تا به یک متخصص DBMS_ALERT تبدیل شوید.

اگر می خواهید در مورد پکیج DBMS_STATS در بخش آموزش PL/SQL بیشتر آشنا بشید نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

DBMS_ALERT چیست؟

DBMS_ALERT یکی از پکیج‌های داخلی Oracle Database است که امکان ارتباط Async بین سشن‌های مختلف دیتابیس را فراهم می‌کند.

به زبان ساده، با استفاده از این پکیج، یک سشن می‌تواند یک پیغام (Alert) بفرستد و سایر سشن‌هایی که روی آن گوش داده‌اند، این پیغام را دریافت کنند.

چرا باید از DBMS_ALERT استفاده کنیم؟

  • ارتباط سریع بین پروسه‌ها بدون نیاز به چک‌کردن‌های مداوم یا همان (Polling)
  • ایجاد برنامه‌های Event-Driven در Oracle
  • کاهش بار روی دیتابیس نسبت به روش‌های دستی
  • استفاده آسان در Oracle Forms، Apex و سایر اپلیکیشن‌ها

معرفی کامل توابع و پروسیجرهای DBMS_ALERT

۱. ثبت‌نام (REGISTER)

با استفاده از REGISTER، یک سشن اعلام می‌کند که می‌خواهد منتظر یک نام خاص باشد.

کد نمونه:

				
					BEGIN
  DBMS_ALERT.REGISTER('ALERT_ORDERS');
END;

				
			

مثال: این کد باعث می‌شود سشن فعلی روی alert به نام ALERT_ORDERS گوش کند.

۲. ارسال هشدار (SIGNAL)

این تابع برای فرستادن پیام به سشن‌های ثبت شده استفاده می‌شود.

کد نمونه:

				
					BEGIN
  DBMS_ALERT.SIGNAL('ALERT_ORDERS', 'Order number 1234 created');
END;

				
			

پیام 'Order number 1234 created' به همه سشن‌هایی که REGISTER کرده‌اند ارسال می‌شود.

۳. انتظار برای یک Alert خاص (WAITONE)

این پروسیجر باعث می‌شود یک سشن منتظر یک alert خاص بماند.

کد نمونه:

				
					DECLARE
  l_message VARCHAR2(4000);
  l_status  NUMBER;
BEGIN
  DBMS_ALERT.WAITONE('ALERT_ORDERS', l_message, l_status, 10);

  IF l_status = 0 THEN
    DBMS_OUTPUT.PUT_LINE('Received alert with message: ' || l_message);
  ELSE
    DBMS_OUTPUT.PUT_LINE('Timeout occurred. No alert received.');
  END IF;
END;

				
			

این کد تا ۱۰ ثانیه صبر می‌کند؛ اگر هشدار دریافت شد، پیام را چاپ می‌کند.

۴. انتظار برای هر Alert ثبت شده (WAITANY)

در این حالت سشن روی هر alert که دریافت شود گوش می‌دهد.

کد نمونه:

				
					DECLARE
  l_name    VARCHAR2(100);
  l_message VARCHAR2(4000);
  l_status  NUMBER;
BEGIN
  DBMS_ALERT.WAITANY(l_name, l_message, l_status, 15);

  IF l_status = 0 THEN
    DBMS_OUTPUT.PUT_LINE('Received alert "' || l_name || '" 
    with message: ' || l_message);
  ELSE
    DBMS_OUTPUT.PUT_LINE('Timeout occurred. No alert received.');
  END IF;
END;

				
			

۵. حذف ثبت‌نام از یک Alert (REMOVE)

برای لغو گوش دادن به یک alert خاص استفاده می‌شود.

کد نمونه:

				
					BEGIN
  DBMS_ALERT.REMOVE('ALERT_ORDERS');
END;

				
			

۶. حذف ثبت‌نام از همه Alert ها (REMOVEALL)

غو ثبت‌نام از تمامی alertهایی که قبلاً ثبت شده‌اند:

کد نمونه:

				
					BEGIN
  DBMS_ALERT.REMOVEALL;
END;

				
			

نکات کلیدی هنگام کار با DBMS_ALERT

  • بعد از SIGNAL باید COMMIT کنید تا پیام به سشن‌های دیگر برسد.
  • قبل از انتظار (WAIT) باید حتماً REGISTER انجام شده باشد.
  • برای استفاده از DBMS_ALERT باید دسترسی اجرا (GRANT EXECUTE) روی این پکیج داشته باشید:
				
					GRANT EXECUTE ON DBMS_ALERT TO your_user;

				
			

نکات کلیدی هنگام کار با DBMS_ALERT

  • بعد از SIGNAL باید COMMIT کنید تا پیام به سشن‌های دیگر برسد.
  • قبل از انتظار (WAIT) باید حتماً REGISTER انجام شده باشد.
  • برای استفاده از DBMS_ALERT باید دسترسی اجرا (GRANT EXECUTE) روی این پکیج داشته باشید:
				
					GRANT EXECUTE ON DBMS_ALERT TO your_user;

				
			

سناریوی واقعی: اطلاع‌رسانی ایجاد سفارشات

۱. ثبت نام برای گوش دادن به سفارش‌های جدید:

				
					BEGIN
  DBMS_ALERT.REGISTER('NEW_ORDER');
END;

				
			

۲. ایجاد سفارش و ارسال alert:

				
					BEGIN
  INSERT INTO orders (order_id, customer_name) VALUES (1001, 'Ali');
  DBMS_ALERT.SIGNAL('NEW_ORDER', 'Order ID 1001 created');
  COMMIT;
END;

				
			

۳. گوش دادن به هشدار:

				
					BEGIN
  INSERT INTO orders (order_id, customer_name) VALUES (1001, 'Ali');
  DBMS_ALERT.SIGNAL('NEW_ORDER', 'Order ID 1001 created');
  COMMIT;
END;

				
			

ساختار و اجزای اصلی DBMS_ALERT

نام تابع/پروسیجر کاربرد توضیح
REGISTER ثبت‌نام برای دریافت یک alert مشخص کردن اینکه سشن روی چه alertهایی گوش می‌دهد
SIGNAL ارسال alert فرستادن پیغام به سشن‌های ثبت شده
WAITONE انتظار برای یک alert خاص بلوک شدن سشن تا دریافت alert یا اتمام زمان انتظار
WAITANY انتظار برای هر alert ثبت شده گوش دادن برای دریافت اولین alert ثبت شده
REMOVE حذف ثبت‌نام یک alert قطع گوش دادن به یک alert مشخص
REMOVEALL حذف تمام ثبت‌نام‌ها لغو ثبت تمام alertهای سشن جاری

سوالات متداول درباره پکیج DBMS_ALERT در اوراکل

DBMS_ALERT یک پکیج داخلی در Oracle Database است که امکان ارسال و دریافت پیام (Alert) بین سشن‌های مختلف دیتابیس را به صورت آسنکرون فراهم می‌کند.

این ابزار معمولاً برای ایجاد سیستم‌های (Real-Time) و رویداد محور (Event-Driven) بدون نیاز به polling دستی استفاده می‌شود.

هر دو برای ارتباط بین سشن‌ها در Oracle استفاده می‌شوند، اما:

  • DBMS_ALERT بیشتر برای ارسال رویداد (Event Notification) استفاده می‌شود.
  • DBMS_PIPE برای ارسال داده‌های ساختار یافته یا غیرساختار یافته بین سشن‌ها کاربرد دارد و نیاز به مدیریت بیشتری در پیاده‌سازی دارد. به طور خلاصه، برای ارسال ساده‌ی پیغام، DBMS_ALERT مناسب‌تر و سریع‌تر است.

بله، حتماً. بدون COMMIT، سیگنال ارسال شده توسط دیگر سشن‌ها قابل مشاهده نخواهد بود.
DBMS_ALERT.SIGNAL تنها پس از کامیت شدن تراکنش تاثیرگذار می‌شود.

شما می‌توانید با ثبت چندین alert مختلف توسط REGISTER و سپس استفاده از WAITANY منتظر دریافت اولین alert ثبت شده باشید

. این روش به شما اجازه می‌دهد چندین event مختلف را با یک کد ساده مدیریت کنید.

نتیجه‌گیری

استفاده از DBMS_ALERT یکی از بهترین راه‌ها برای ارتباط سریع و بلادرنگ بین سشن‌های اوراکل است.

این پکیج می‌تواند بار دیتابیس را کاهش داده و تجربه کاربری سیستم‌های تعاملی را به شدت بهبود ببخشد.

با درک کامل نحوه استفاده از REGISTER، SIGNAL و WAIT، شما قادر خواهید بود سیستم‌های EventDriven پیشرفته در Oracle Database طراحی کنید.

📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از پکیج DBMS_ALERT دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

میثم راد

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *