PL/SQL-এ Triggers এবং Exception Handling দুটি গুরুত্বপূর্ণ কনসেপ্ট যা ডেটাবেস অপারেশনের মধ্যে স্বয়ংক্রিয় ক্রিয়া এবং ত্রুটি মোকাবিলার জন্য ব্যবহৃত হয়। নিচে এগুলির বিস্তারিত ব্যাখ্যা ও উদাহরণ দেওয়া হলো।
1. Trigger উদাহরণ
Trigger হল একটি বিশেষ ধরনের প্রোগ্রাম যা ডেটাবেসে কোনো নির্দিষ্ট ইভেন্ট (যেমন INSERT, UPDATE, DELETE) ঘটলে স্বয়ংক্রিয়ভাবে চালিত হয়। ট্রিগারগুলি সাধারণত ডেটাবেসের ইনটিগ্রিটি নিশ্চিত করতে ব্যবহৃত হয়, যেমন লগিং, ডেটা ভ্যালিডেশন, অথবা হিসাব রাখার জন্য।
Trigger টাইপস:
- BEFORE Trigger: ইভেন্টের আগে ট্রিগার চালানো হয়।
- AFTER Trigger: ইভেন্টের পরে ট্রিগার চালানো হয়।
- INSTEAD OF Trigger: কোনো
INSERT,UPDATE, বাDELETEইভেন্টের পরিবর্তে ট্রিগার চালানো হয় (যেমন ভিউতে পরিবর্তন করতে)।
উদাহরণ:
ধরা যাক, আপনার একটি employees টেবিল আছে এবং আপনি চান যে, কোনো কর্মচারীর বেতন যখন আপডেট হবে, তখন তার সাথে সংশ্লিষ্ট লগে সেই আপডেটের তথ্য রাখা হোক। এজন্য একটি AFTER UPDATE ট্রিগার তৈরি করা হবে।
-- Step 1: Create the Log Table
CREATE TABLE employee_salary_log (
log_id NUMBER PRIMARY KEY,
employee_id NUMBER,
old_salary NUMBER,
new_salary NUMBER,
update_time TIMESTAMP
);
-- Step 2: Create the Trigger
CREATE OR REPLACE TRIGGER trg_salary_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
-- Insert old and new salary details into the log table
INSERT INTO employee_salary_log (log_id, employee_id, old_salary, new_salary, update_time)
VALUES (employee_salary_log_seq.NEXTVAL, :OLD.employee_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
এখানে,
- AFTER UPDATE ট্রিগারটি
employeesটেবিলে কোনো রেকর্ড আপডেট হওয়ার পর চলবে। :OLDএবং:NEWব্যবহার করে পুরনো এবং নতুন মানের মধ্যে পার্থক্য বের করা হয়েছে।- এই ট্রিগারটি একটি
employee_salary_logটেবিলে সেই পরিবর্তনের লগ রাখবে।
কীভাবে কাজ করবে:
যখন employees টেবিলে কোনো কর্মচারীর বেতন পরিবর্তিত হবে, তখন এই ট্রিগারটি চালু হবে এবং সংশ্লিষ্ট কর্মচারীর পুরনো এবং নতুন বেতনসহ একটি লগ তৈরি করবে।
2. Exception Handling উদাহরণ
Exception Handling হল একটি পদ্ধতি যা ডেটাবেস অপারেশনের সময় কোনো ত্রুটি (error) ঘটলে সেগুলিকে সঠিকভাবে মোকাবিলা করতে ব্যবহৃত হয়। PL/SQL-এ Exception Handling বিভিন্ন ধরনের ত্রুটির জন্য একটি নির্দিষ্ট ব্লক প্রস্তুত করে, যাতে ত্রুটি ঘটলে তা সঠিকভাবে পরিচালনা করা যায়।
Exception Handling এর স্টেপস:
- Predefined Exceptions: আগেই ডিফাইন করা ত্রুটির ধরন, যেমন
NO_DATA_FOUND,TOO_MANY_ROWS, ইত্যাদি। - User-defined Exceptions: আপনি নিজে যে ত্রুটি তৈরি করেন তা।
- EXCEPTION Block: যেখানে ত্রুটিগুলি ক্যাচ করা হয় এবং সেই অনুযায়ী ব্যবস্থা নেওয়া হয়।
উদাহরণ:
ধরা যাক, আপনি একটি employees টেবিল থেকে কর্মচারীর বেতন বের করতে চান, কিন্তু যদি কর্মচারী না পাওয়া যায়, তাহলে একটি কাস্টম ত্রুটি দেখাতে চান।
DECLARE
v_employee_id NUMBER := 101;
v_salary NUMBER;
BEGIN
-- Try to get the salary for a given employee
SELECT salary INTO v_salary
FROM employees
WHERE employee_id = v_employee_id;
-- If no data found, raise an exception
IF v_salary IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'Employee not found with ID ' || v_employee_id);
END IF;
-- If salary is found, display it
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No employee found with ID ' || v_employee_id);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
এখানে:
SELECTস্টেটমেন্টটিemployeesটেবিল থেকেsalaryবের করার চেষ্টা করছে।- যদি কর্মচারী না পাওয়া যায়, তাহলে
NO_DATA_FOUNDpredefined exception ক্যাচ করা হবে। - যদি অন্য কোনো ত্রুটি ঘটে, তবে
WHEN OTHERSব্লকটি সেই ত্রুটিকে ক্যাচ করে এবং একটি ডিফল্ট ত্রুটি বার্তা দেখাবে।
কীভাবে কাজ করবে:
- যদি কর্মচারী
employee_id = 101পাওয়া না যায়, তাহলে "No employee found with ID 101" বার্তা প্রদর্শিত হবে। - অন্য কোনো ত্রুটি হলে, সিস্টেম ত্রুটির বার্তা দেখাবে।
Trigger এবং Exception Handling-এর সমন্বিত উদাহরণ
ধরা যাক, আপনি চান যখন কোনো কর্মচারী DELETE হবে, তখন সেই তথ্য একটি লগ টেবিলে রেকর্ড করা হোক। তবে, যদি কোনো কর্মচারী পাওয়া না যায়, তবে ত্রুটি ম্যানেজমেন্টের মাধ্যমে একটি কাস্টম ত্রুটি বার্তা দেখানো হবে।
-- Step 1: Create the Log Table
CREATE TABLE employee_delete_log (
log_id NUMBER PRIMARY KEY,
employee_id NUMBER,
deleted_at TIMESTAMP
);
-- Step 2: Create the Trigger
CREATE OR REPLACE TRIGGER trg_employee_delete
BEFORE DELETE ON employees
FOR EACH ROW
DECLARE
v_employee_exists NUMBER;
BEGIN
-- Check if the employee exists before deleting
SELECT COUNT(*) INTO v_employee_exists
FROM employees
WHERE employee_id = :OLD.employee_id;
IF v_employee_exists = 0 THEN
-- Raise custom exception if employee does not exist
RAISE_APPLICATION_ERROR(-20002, 'Employee with ID ' || :OLD.employee_id || ' does not exist');
END IF;
-- Insert delete log
INSERT INTO employee_delete_log (log_id, employee_id, deleted_at)
VALUES (employee_delete_log_seq.NEXTVAL, :OLD.employee_id, SYSDATE);
END;
এখানে,
- BEFORE DELETE ট্রিগারটি
employeesটেবিল থেকে রেকর্ড মুছে ফেলার আগে চেক করে যে ওই কর্মচারীটি টেবিলে আছে কিনা। - যদি কর্মচারী না থাকে, তবে
RAISE_APPLICATION_ERRORব্যবহার করে একটি কাস্টম ত্রুটি বার্তা সৃষ্টি হয়। - যদি কর্মচারী পাওয়া যায়, তবে একটি ডিলিট লগ
employee_delete_logটেবিলে ইনসার্ট করা হবে।
উপসংহার
Triggers এবং Exception Handling PL/SQL-এ অত্যন্ত গুরুত্বপূর্ণ দুটি কৌশল যা ডেটাবেস অপারেশনগুলিকে আরও শক্তিশালী, সুরক্ষিত এবং নির্ভরযোগ্য করে তোলে। Triggers স্বয়ংক্রিয় কাজ সম্পাদন করতে ব্যবহৃত হয়, এবং Exception Handling ত্রুটি পরিস্থিতি মোকাবিলার জন্য ব্যবহৃত হয়। এগুলি একসাথে ব্যবহার করে ডেটাবেসের প্রক্রিয়াগুলিকে আরও কার্যকরী এবং নিরাপদ করা সম্ভব।
Read more