
مقدمه : استفاده از پکیج 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
، شما قادر خواهید بود سیستمهای Event–Driven پیشرفته در Oracle Database طراحی کنید.
📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از پکیج DBMS_ALERT دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید