MariaDB স্টোরড প্রসিডিউর এবং ফাংশন

মারিয়া ডিবি (MariaDB) - Database Tutorials

277

MariaDB-তে স্টোরড প্রসিডিউর (Stored Procedure) এবং ফাংশন (Function) হল সঞ্চিত SQL কোড যা ডেটাবেসে একাধিক SQL স্টেটমেন্টের সমন্বয়ে তৈরি হয় এবং প্রোগ্রাম্যাটিকভাবে ব্যবহার করা হয়। এগুলো ডেটাবেসের মধ্যে পুনঃব্যবহারযোগ্য কোড হিসেবে কাজ করে, যাতে কোডের পুনরাবৃত্তি কমানো যায় এবং পারফরম্যান্স উন্নত হয়। তবে স্টোরড প্রসিডিউর এবং ফাংশনের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।


স্টোরড প্রসিডিউর (Stored Procedure)

স্টোরড প্রসিডিউর হল একটি সঞ্চিত SQL স্ক্রিপ্ট যা এক বা একাধিক SQL অপারেশন একযোগে চালাতে ব্যবহৃত হয়। এটি একটি নামকৃত ব্লক হিসেবে সংরক্ষিত থাকে এবং তখনি এক্সিকিউট করা হয় যখন প্রয়োজন হয়।

স্টোরড প্রসিডিউর তৈরি (Creating a Stored Procedure)

স্টোরড প্রসিডিউর তৈরি করার জন্য CREATE PROCEDURE কমান্ড ব্যবহার করা হয়।

গঠন:

CREATE PROCEDURE procedure_name ([parameters])
BEGIN
    -- SQL Statements
END;

উদাহরণ

স্টোরড প্রসিডিউর তৈরি:

DELIMITER CREATEPROCEDUREgetstudentdetails(INstudentidINT)BEGINSELECT*FROMstudentsWHEREstudentid=studentid;END

CREATE PROCEDURE get_student_details(IN student_id INT)
BEGIN
    SELECT * FROM students WHERE student_id = student_id;
END

DELIMITER ;

এখানে, get_student_details নামক স্টোরড প্রসিডিউরটি একটি ইনপুট প্যারামিটার হিসেবে student_id গ্রহণ করে এবং তার জন্য স্টুডেন্টের বিস্তারিত তথ্য রিটার্ন করে।

স্টোরড প্রসিডিউর কল করা (Calling a Stored Procedure)

একবার স্টোরড প্রসিডিউর তৈরি হলে, এটি CALL কমান্ডের মাধ্যমে কল করা যায়।

CALL get_student_details(1);

এটি student_id ১ এর জন্য ছাত্রের তথ্য ফিরিয়ে দেবে।

স্টোরড প্রসিডিউরের মধ্যে লজিক

স্টোরড প্রসিডিউরের মধ্যে কন্ডিশনাল লজিক, লুপ, এবং ট্রানজেকশনও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ:

DELIMITER CREATEPROCEDUREupdatestudentage(INstudentidINT,INnewageINT)BEGINDECLAREcurrentageINT;SELECTageINTOcurrentageFROMstudentsWHEREstudentid=studentid;IFcurrentage!=newageTHENUPDATEstudentsSETage=newageWHEREstudentid=studentid;ENDIF;END

CREATE PROCEDURE update_student_age(IN student_id INT, IN new_age INT)
BEGIN
    DECLARE current_age INT;

    SELECT age INTO current_age FROM students WHERE student_id = student_id;
    
    IF current_age != new_age THEN
        UPDATE students SET age = new_age WHERE student_id = student_id;
    END IF;
END

DELIMITER ;

এটি student_id এবং new_age গ্রহণ করে এবং যদি বর্তমান বয়সের সাথে নতুন বয়সের পার্থক্য থাকে, তবে সেই বয়স আপডেট করবে।


ফাংশন (Function)

ফাংশনও স্টোরড প্রসিডিউরের মতো এক বা একাধিক SQL অপারেশন সম্পাদন করতে ব্যবহৃত হয়, তবে এটি সবসময় একটি মান রিটার্ন করে। ফাংশন সাধারণত কোনো একক মান গণনা বা যাচাই করার জন্য ব্যবহৃত হয় এবং SQL স্টেটমেন্টে এক্সপ্রেশন হিসেবে ব্যবহার করা যায়।

ফাংশন তৈরি (Creating a Function)

ফাংশন তৈরি করার জন্য CREATE FUNCTION কমান্ড ব্যবহার করা হয়।

গঠন:

CREATE FUNCTION function_name ([parameters])
RETURNS data_type
BEGIN
    -- SQL Statements
    RETURN value;
END;

উদাহরণ

ফাংশন তৈরি:

DELIMITER CREATEFUNCTIONgetstudentname(studentidINT)RETURNSVARCHAR(100)BEGINDECLAREstudentnameVARCHAR(100);SELECTnameINTOstudentnameFROMstudentsWHEREstudentid=studentid;RETURNstudentname;END

CREATE FUNCTION get_student_name(student_id INT)
RETURNS VARCHAR(100)
BEGIN
    DECLARE student_name VARCHAR(100);
    SELECT name INTO student_name FROM students WHERE student_id = student_id;
    RETURN student_name;
END

DELIMITER ;

এটি student_id প্রদান করলে, সেই ছাত্রের নাম ফিরিয়ে দিবে।

ফাংশন কল করা (Calling a Function)

ফাংশন কল করতে SELECT স্টেটমেন্টের মধ্যে ফাংশনটির নাম ব্যবহার করা হয়।

SELECT get_student_name(1);

এটি student_id ১ এর জন্য ছাত্রের নাম রিটার্ন করবে।


স্টোরড প্রসিডিউর এবং ফাংশনের মধ্যে পার্থক্য

বৈশিষ্ট্যস্টোরড প্রসিডিউর (Stored Procedure)ফাংশন (Function)
রিটার্ন ভ্যালুরিটার্ন ভ্যালু নেই (এটি ডেটা পরিবর্তন করতে পারে)একটি একক মান রিটার্ন করে
ব্যবহারবিশেষ অপারেশন সম্পাদন করতে ব্যবহৃতএক্সপ্রেশন বা কন্ডিশনে ব্যবহার হয়
কলিংCALL কমান্ডের মাধ্যমে কল করা হয়SELECT স্টেটমেন্টে কল করা হয়
ডেটাবেস অপারেশনট্রানজেকশন, লুপ, কন্ডিশনাল লজিক সহ ব্যবহার করা যেতে পারেসাধারণত একক মান প্রক্রিয়া করা হয়

ট্রানজেকশন এবং স্টোরড প্রসিডিউর

স্টোরড প্রসিডিউর ট্রানজেকশনের সাথে কাজ করতে পারে, যেমন:

DELIMITER CREATEPROCEDUREtransferfunds(INsenderidINT,INreceiveridINT,INamountDECIMAL(10,2))BEGINDECLAREsenderbalanceDECIMAL(10,2);DECLAREreceiverbalanceDECIMAL(10,2);STARTTRANSACTION;--Sender'sbalanceSELECTbalanceINTOsenderbalanceFROMaccountsWHEREaccountid=senderid;--Receiver'sbalanceSELECTbalanceINTOreceiverbalanceFROMaccountsWHEREaccountid=receiverid;--Updatesender'sbalanceUPDATEaccountsSETbalance=senderbalance-amountWHEREaccountid=senderid;--Updatereceiver'sbalanceUPDATEaccountsSETbalance=receiverbalance+amountWHEREaccountid=receiverid;COMMIT;END

CREATE PROCEDURE transfer_funds(IN sender_id INT, IN receiver_id INT, IN amount DECIMAL(10,2))
BEGIN
    DECLARE sender_balance DECIMAL(10,2);
    DECLARE receiver_balance DECIMAL(10,2);

    START TRANSACTION;

    -- Sender's balance
    SELECT balance INTO sender_balance FROM accounts WHERE account_id = sender_id;

    -- Receiver's balance
    SELECT balance INTO receiver_balance FROM accounts WHERE account_id = receiver_id;

    -- Update sender's balance
    UPDATE accounts SET balance = sender_balance - amount WHERE account_id = sender_id;

    -- Update receiver's balance
    UPDATE accounts SET balance = receiver_balance + amount WHERE account_id = receiver_id;

    COMMIT;
END

DELIMITER ;

এটি একটি স্টোরড প্রসিডিউর যা দুটি অ্যাকাউন্টের মধ্যে টাকা ট্রান্সফার করার জন্য ট্রানজেকশন ব্যবহার করে।


ডিবাগিং এবং ত্রুটি পরিচালনা (Error Handling)

স্টোরড প্রসিডিউর এবং ফাংশনের মধ্যে ত্রুটি পরিচালনা করার জন্য MariaDB-তে DECLARE ... HANDLER ব্যবহার করা হয়। এটি ত্রুটি ঘটলে নির্দিষ্ট কাজ সম্পাদন করতে সাহায্য করে।

উদাহরণ: ত্রুটি পরিচালনা

DELIMITER CREATEPROCEDUREsafeupdatebalance(INaccountidINT,INnewbalanceDECIMAL(10,2))BEGINDECLARECONTINUEHANDLERFORSQLEXCEPTIONROLLBACK;STARTTRANSACTION;UPDATEaccountsSETbalance=newbalanceWHEREaccountid=accountid;COMMIT;END

CREATE PROCEDURE safe_update_balance(IN account_id INT, IN new_balance DECIMAL(10,2))
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        ROLLBACK;

    START TRANSACTION;

    UPDATE accounts SET balance = new_balance WHERE account_id = account_id;

    COMMIT;
END

DELIMITER ;

এটি যদি কোনো ত্রুটি ঘটে, তবে ট্রানজেকশনটি রোলব্যাক করবে এবং কোনো পরিবর্তন ডেটাবেসে সেভ হবে না।


সারাংশ

MariaDB-তে স্টোরড প্রসিডিউর এবং ফাংশন ডেটাবেসের কোড পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা উন্নত করতে ব্যবহৃত হয়। স্টোরড প্রসিডিউরগুলি একটি গ্রুপের মতো SQL স্টেটমেন্টগুলি একত্রে সম্পাদন করতে সাহায্য করে, যখন ফাংশন একক মান রিটার্ন করে। এই দুটিই ডেটাবেসের মধ্যে নির্দিষ্ট কাজ সম্পাদনের জন্য গুরুত্বপূর্ণ এবং কার্যকরী টুল হিসেবে ব্যবহৃত হয়।

Content added By

Stored Procedure (স্টোরড প্রোসিডিউর) হলো একটি ডেটাবেস অবজেক্ট যা এক বা একাধিক SQL স্টেটমেন্টের একটি গ্রুপ হিসেবে সংরক্ষিত হয়। এটি ডেটাবেসের মধ্যে সংরক্ষিত একটি ফাংশনাল কোড যা নির্দিষ্ট কাজ করতে ব্যবহৃত হয়। যখনই সেই কাজটি আবার প্রয়োজন হয়, তখন সেই স্টোরড প্রোসিডিউরটি কল করা হয়, ফলে কোড পুনরায় লেখা বা বারবার ব্যবহারের প্রয়োজন হয় না।

MariaDB-তে স্টোরড প্রোসিডিউর ব্যবহারের মাধ্যমে অনেকগুলো সুবিধা পাওয়া যায়, যেমন পারফরম্যান্স উন্নত করা, কোড পুনঃব্যবহারযোগ্যতা, এবং ডেটাবেসের কাজের সিস্টেমেটিক হ্যান্ডলিং।


Stored Procedure এর সুবিধাসমূহ

  1. কোড পুনঃব্যবহারযোগ্যতা: একবার একটি স্টোরড প্রোসিডিউর তৈরি করা হলে, সেটি বারবার ব্যবহার করা যায়। ফলে কোডের পুনঃলিখন এড়ানো যায় এবং ডেটাবেসের কাজ সহজ হয়ে যায়।
  2. পারফরম্যান্স বৃদ্ধি: স্টোরড প্রোসিডিউরগুলি ডেটাবেসের মধ্যে সংরক্ষিত থাকে, ফলে ক্লায়েন্ট অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে নেটওয়ার্ক ট্র্যাফিক কম হয়। এছাড়া, MariaDB স্টোরড প্রোসিডিউর কম্পাইল করা থাকে, যা কোয়েরির পারফরম্যান্স বাড়াতে সহায়ক।
  3. ডেটাবেস লজিক কেন্দ্রিত: সমস্ত লজিক ডেটাবেসের মধ্যে সংরক্ষিত থাকায়, অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে লজিকের দ্বন্দ্ব কমে যায়। এটি কোড মেইনটেন্যান্সকে সহজ করে তোলে।
  4. ট্রানজেকশন সমর্থন: স্টোরড প্রোসিডিউর ট্রানজেকশন পরিচালনা করতে সহায়ক, যা একাধিক SQL অপারেশন একসঙ্গে সফলভাবে অথবা ব্যর্থভাবে সম্পন্ন করতে সক্ষম।
  5. নিরাপত্তা বৃদ্ধি: ব্যবহারকারীরা সরাসরি SQL কোড না লিখে শুধুমাত্র স্টোরড প্রোসিডিউর কল করতে পারে, যা নিরাপত্তার একটি অতিরিক্ত স্তর যোগ করে। এটি SQL ইনজেকশন প্রতিরোধে সহায়ক।

Stored Procedure তৈরি করা

স্টোরড প্রোসিডিউর তৈরি করতে CREATE PROCEDURE কমান্ড ব্যবহার করা হয়।

সাধারণ গঠন

CREATE PROCEDURE procedure_name()
BEGIN
    SQL_statement;
END;

উদাহরণ

ধরা যাক, আমাদের একটি students টেবিল রয়েছে, এবং আমরা একটি স্টোরড প্রোসিডিউর তৈরি করতে চাই যা শিক্ষার্থীর নামের ভিত্তিতে তাদের তথ্য সংগ্রহ করবে।

CREATE PROCEDURE GetStudentByName(IN student_name VARCHAR(100))
BEGIN
    SELECT * FROM students WHERE name = student_name;
END;

এই প্রোসিডিউরটি students টেবিল থেকে নির্দিষ্ট নামের শিক্ষার্থীকে খুঁজে বের করবে।


Stored Procedure কল করা

একবার স্টোরড প্রোসিডিউর তৈরি হলে, সেটি কল করতে CALL কমান্ড ব্যবহার করা হয়।

উদাহরণ

CALL GetStudentByName('John Doe');

এটি GetStudentByName প্রোসিডিউরটি কল করবে এবং John Doe নামের শিক্ষার্থীর তথ্য প্রদর্শন করবে।


Stored Procedure-এ ইনপুট এবং আউটপুট প্যারামিটার

স্টোরড প্রোসিডিউর ইনপুট এবং আউটপুট প্যারামিটার গ্রহণ করতে পারে। এগুলো স্টোরড প্রোসিডিউরের মধ্যে ডেটা পাস করার জন্য ব্যবহৃত হয়।

ইনপুট প্যারামিটার (IN)

ইনপুট প্যারামিটার ব্যবহারকারী থেকে ডেটা গ্রহণ করতে ব্যবহৃত হয়।

CREATE PROCEDURE GetStudentByAge(IN student_age INT)
BEGIN
    SELECT * FROM students WHERE age = student_age;
END;

আউটপুট প্যারামিটার (OUT)

আউটপুট প্যারামিটার ব্যবহার করে প্রোসিডিউরটির ভিতর থেকে ফলাফল ফিরিয়ে আনা যায়।

CREATE PROCEDURE GetTotalStudents(OUT total_students INT)
BEGIN
    SELECT COUNT(*) INTO total_students FROM students;
END;

এখানে total_students আউটপুট প্যারামিটার হিসেবে ব্যবহৃত হবে এবং এটি শিক্ষার্থীদের মোট সংখ্যা প্রদান করবে।

ইনপুট এবং আউটপুট প্যারামিটার ব্যবহার

CALL GetTotalStudents(@total);
SELECT @total;

Stored Procedure-এর মধ্যে কন্ডিশনাল লজিক ব্যবহার

স্টোরড প্রোসিডিউরের মধ্যে কন্ডিশনাল লজিক (যেমন IF, CASE ইত্যাদি) ব্যবহার করা যায়।

উদাহরণ

CREATE PROCEDURE GetStudentDetails(IN student_id INT)
BEGIN
    IF student_id > 0 THEN
        SELECT * FROM students WHERE id = student_id;
    ELSE
        SELECT 'Invalid student ID' AS Error;
    END IF;
END;

এই প্রোসিডিউরটি চেক করবে, যদি student_id পজিটিভ হয় তবে সংশ্লিষ্ট শিক্ষার্থীর তথ্য দেখাবে, অন্যথায় একটি ত্রুটি বার্তা প্রদান করবে।


Stored Procedure-এ লুপ ব্যবহার

স্টোরড প্রোসিডিউরগুলিতে লুপ (LOOP, WHILE, FOR) ব্যবহার করে একাধিক অপারেশন বা পুনরাবৃত্তি করা যেতে পারে।

উদাহরণ

CREATE PROCEDURE RepeatMessage(IN num_times INT)
BEGIN
    DECLARE counter INT DEFAULT 1;
    WHILE counter <= num_times DO
        SELECT 'Hello, World!';
        SET counter = counter + 1;
    END WHILE;
END;

এটি Hello, World! বার্তা নির্দিষ্ট সংখ্যক বার প্রিন্ট করবে।


সারাংশ

MariaDB-তে Stored Procedure ব্যবহার করে ডেটাবেসের কোডকে কার্যকরী, পুনঃব্যবহারযোগ্য এবং সেন্ট্রালাইজড করা যায়। এটি ডেটাবেসের লজিক কেন্দ্রীক করে, পারফরম্যান্স উন্নত করে, এবং নিরাপত্তা বাড়ায়। স্টোরড প্রোসিডিউর ইনপুট এবং আউটপুট প্যারামিটার সমর্থন করে, কন্ডিশনাল লজিক এবং লুপের মাধ্যমে জটিল অপারেশনগুলো পরিচালনা করতে সক্ষম।


Content added By

মারিয়া ডিবি (MariaDB)-তে Stored Procedure হলো একটি প্রি-কম্পাইলড SQL কোডের স্যুট, যা একাধিক SQL স্টেটমেন্ট একত্রে সম্পাদন করার জন্য ব্যবহৃত হয়। একবার স্টোরড প্রসিডিওর তৈরি হয়ে গেলে, আপনি এটি বার বার কল করতে পারেন, যা কোডের পুনরাবৃত্তি এড়াতে এবং কর্মক্ষমতা বাড়াতে সহায়তা করে।


Stored Procedure তৈরি করা

Stored Procedure তৈরি করতে CREATE PROCEDURE স্টেটমেন্ট ব্যবহার করা হয়। এর মাধ্যমে একটি নতুন প্রসিডিওর ডিফাইন করা হয়, যাতে একটি নির্দিষ্ট কাজ সম্পাদন করার জন্য একাধিক SQL স্টেটমেন্ট অন্তর্ভুক্ত থাকে।

Stored Procedure তৈরি করার সাধারণ সিনট্যাক্স:

CREATE PROCEDURE procedure_name (parameter_list)
BEGIN
    SQL_statement_1;
    SQL_statement_2;
    ...
END;
  • procedure_name: স্টোরড প্রসিডিওরের নাম।
  • parameter_list: আর্গুমেন্ট বা প্যারামিটার (যদি থাকে), যেগুলো ইনপুট বা আউটপুট হিসেবে প্রসিডিওরকে পাস করা হবে।
  • SQL_statement_1, SQL_statement_2: একাধিক SQL স্টেটমেন্ট যা একে অপরের সাথে যুক্ত হয়ে কার্যকর হবে।

Stored Procedure তৈরি করার উদাহরণ

ধরা যাক, আমরা একটি employees টেবিল তৈরি করেছি, এবং আমরা একটি Stored Procedure তৈরি করতে চাই যা একটি নির্দিষ্ট department_id অনুসারে কর্মচারীদের নাম এবং তাদের বেতন দেখাবে।

১. employees টেবিল তৈরি করা:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    salary DECIMAL(10, 2)
);

২. Stored Procedure তৈরি করা:

CREATE PROCEDURE GetEmployeesByDepartment (IN dept_id INT)
BEGIN
    SELECT name, salary
    FROM employees
    WHERE department_id = dept_id;
END;

এখানে:

  • GetEmployeesByDepartment হল Stored Procedure এর নাম।
  • dept_id একটি ইনপুট প্যারামিটার, যার মাধ্যমে নির্দিষ্ট ডিপার্টমেন্টের কর্মচারীদের তথ্য বের করা হবে।
  • SELECT স্টেটমেন্ট দিয়ে সংশ্লিষ্ট ডিপার্টমেন্টের কর্মচারীদের নাম এবং বেতন দেখানো হবে।

Stored Procedure কল করা

Stored Procedure কল করতে CALL স্টেটমেন্ট ব্যবহার করা হয়। যখন আপনি প্রসিডিওরটি কল করবেন, তখন আপনি আর্গুমেন্ট হিসেবে প্যারামিটার প্রদান করতে পারেন (যদি থাকে)।

উদাহরণ:

CALL GetEmployeesByDepartment(2);

এই কুয়েরিটি department_id = 2 এর জন্য কর্মচারীদের নাম এবং বেতন দেখাবে।


Stored Procedure তে আউটপুট প্যারামিটার ব্যবহার

আপনি আউটপুট প্যারামিটার ব্যবহার করে কোনও মান ফিরিয়ে দিতে পারেন। এতে, প্রসিডিওরটি একটি মান ক্যালকুলেট করে এবং সেই মানটি কল করা জায়গায় পাঠানো হয়।

উদাহরণ: আউটপুট প্যারামিটারসহ Stored Procedure

ধরা যাক, আপনি একটি Stored Procedure তৈরি করতে চান যা একটি নির্দিষ্ট department_id এর জন্য মোট বেতন পরিমাণ বের করবে।

CREATE PROCEDURE GetTotalSalaryByDepartment (IN dept_id INT, OUT total_salary DECIMAL(10, 2))
BEGIN
    SELECT SUM(salary) INTO total_salary
    FROM employees
    WHERE department_id = dept_id;
END;

এখানে:

  • dept_id একটি ইনপুট প্যারামিটার, যা আপনাকে নির্দিষ্ট ডিপার্টমেন্ট নির্বাচন করতে সাহায্য করবে।
  • total_salary একটি আউটপুট প্যারামিটার, যা নির্দিষ্ট ডিপার্টমেন্টের মোট বেতন পরিমাণ ধারণ করবে।

Stored Procedure কল করা এবং আউটপুট পাওয়া:

-- আউটপুট প্যারামিটারটি একটি ভ্যারিয়েবল হিসেবে সংরক্ষণ করা
SET @total_salary = 0;

-- Stored Procedure কল করা
CALL GetTotalSalaryByDepartment(2, @total_salary);

-- আউটপুট দেখানো
SELECT @total_salary;

এখানে, GetTotalSalaryByDepartment Stored Procedure-টি কল করা হয়েছে এবং আউটপুট প্যারামিটার @total_salary-এ মোট বেতন পরিমাণ সংরক্ষণ করা হয়েছে। পরবর্তীতে SELECT স্টেটমেন্টের মাধ্যমে এই মান দেখানো হয়েছে।


Stored Procedure এর সুবিধা

  1. কোড পুনরাবৃত্তি কমানো: একাধিক স্থানে একই কোডের পরিবর্তে একটি স্টোরড প্রসিডিওর ব্যবহার করলে কোড পুনরাবৃত্তি কমানো যায়।
  2. কর্মক্ষমতা উন্নতি: স্টোরড প্রসিডিওর সাধারণত একবার কম্পাইল হয় এবং ডেটাবেস সার্ভারে সঞ্চিত থাকে, তাই একে একাধিকবার কল করার মাধ্যমে কর্মক্ষমতা বৃদ্ধি পায়।
  3. ডেটাবেস নিরাপত্তা: স্টোরড প্রসিডিওরের মাধ্যমে নির্দিষ্ট কাজ বা ডেটার প্রতি অ্যাক্সেস সীমিত করা সম্ভব, কারণ আপনি প্যারামিটার নির্দিষ্ট করে কল করতে পারেন।

সারাংশ

মারিয়া ডিবি (MariaDB)-তে Stored Procedure ডেটাবেসে একাধিক SQL স্টেটমেন্ট একত্রে সম্পাদন করার জন্য ব্যবহৃত হয়। এটি কোডের পুনরাবৃত্তি কমায়, কর্মক্ষমতা উন্নত করে এবং ডেটাবেসের নিরাপত্তা নিশ্চিত করতে সহায়তা করে। Stored Procedure তৈরি করতে CREATE PROCEDURE এবং কল করতে CALL স্টেটমেন্ট ব্যবহার করা হয়। এটি ইনপুট ও আউটপুট প্যারামিটার সমর্থন করে, যার মাধ্যমে ডেটা পরিচালনা করা সহজ হয়।

Content added By

User-defined functions (UDFs) হল সেই ফাংশনগুলি, যা ব্যবহারকারীরা নিজেদের প্রয়োজন অনুযায়ী মারিয়া ডিবি (MariaDB) ডেটাবেসে তৈরি করতে পারেন। এগুলি SQL কোয়েরি চলাকালীন বিশেষ কিছু কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়, যা স্ট্যান্ডার্ড SQL ফাংশন দ্বারা করা সম্ভব নয়। UDF ব্যবহার করে আপনি কাস্টম লগিক বা ক্য্যালকুলেশন যুক্ত করতে পারেন।

মারিয়া ডিবি তে UDF তৈরি করতে C বা C++ ভাষায় কোড লিখতে হয় এবং তারপর সেই কোডকে ডেটাবেসের সঙ্গে সংযুক্ত করতে হয়। মারিয়া ডিবি তে UDF তৈরি করার পদ্ধতি বেশ কিছু স্টেপ অনুসরণ করে করা হয়।


UDF তৈরি করার জন্য প্রস্তুতি

১. MariaDB UDF লাইব্রেরি ইনস্টল করা

প্রথমে, মারিয়া ডিবি তে UDF তৈরি করার জন্য সঠিক লাইব্রেরি (উদাহরণস্বরূপ libmariadb.so) ইনস্টল করা প্রয়োজন। এটি সাধারণত সার্ভার সিস্টেমে ডিফল্টভাবেই ইনস্টল থাকে, তবে যদি না থাকে, তাহলে আপনি সিস্টেমের প্যাকেজ ম্যানেজার ব্যবহার করে এটি ইনস্টল করতে পারেন।


UDF তৈরি করার ধাপ

২. C বা C++ কোড লেখা

একটি UDF তৈরি করতে হলে আপনাকে প্রথমে C বা C++ ভাষায় কোড লিখতে হবে। নিচে একটি উদাহরণ দেওয়া হল যেখানে একটি সিম্পল ফাংশন তৈরি করা হয়েছে যা দুটি পূর্ণসংখ্যার যোগফল বের করবে।

#include <mysql/mysql.h>

extern "C" {

  my_bool add_numbers_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
  void add_numbers_deinit(UDF_INIT *initid);
  long long add_numbers(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

  my_bool add_numbers_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
    if (args->arg_count != 2) {
      strcpy(message, "add_numbers() requires 2 arguments");
      return 1;
    }
    args->arg_type[0] = INT_RESULT;
    args->arg_type[1] = INT_RESULT;
    return 0;
  }

  void add_numbers_deinit(UDF_INIT *initid) {}

  long long add_numbers(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
    long long num1 = *((long long*) args->args[0]);
    long long num2 = *((long long*) args->args[1]);
    return num1 + num2;
  }
}

এই কোডটি দুটি পূর্ণসংখ্যার যোগফল বের করার একটি ফাংশন তৈরি করবে।


৩. UDF কম্পাইল করা

এবার C বা C++ কোডটি মারিয়া ডিবি সার্ভারের জন্য কম্পাইল করতে হবে। নিচের কমান্ডটি ব্যবহার করে আপনি কোডটি কম্পাইল করতে পারেন:

gcc -shared -fPIC -o add_numbers.so add_numbers.c -I/usr/include/mysql

এখানে, add_numbers.c হল কোডের সোর্স ফাইল এবং add_numbers.so হল কম্পাইল করা লাইব্রেরি ফাইল যা আপনি মারিয়া ডিবি তে ব্যবহার করবেন।


৪. UDF লাইব্রেরি লোড করা

ফাংশনটি তৈরি করার পর, আপনি এটি মারিয়া ডিবি তে লোড করতে পারবেন। এটি করার জন্য, নিচের SQL কোডটি ব্যবহার করুন:

CREATE FUNCTION add_numbers RETURNS INTEGER SONAME 'add_numbers.so';

এটি add_numbers.so লাইব্রেরি ফাইলটি মারিয়া ডিবি তে লোড করবে এবং add_numbers ফাংশনটি ডেটাবেসে ব্যবহারের জন্য প্রস্তুত হবে।


৫. UDF ব্যবহার করা

ফাংশনটি সফলভাবে লোড হওয়ার পরে, আপনি এটি SQL কোয়েরিতে ব্যবহার করতে পারবেন:

SELECT add_numbers(10, 20);

এই কোয়েরিটি add_numbers ফাংশনকে কল করবে এবং ১০ এবং ২০ এর যোগফল 30 রিটার্ন করবে।


৬. UDF আনইনস্টল করা

যদি আপনি আর UDF ফাংশনটি ব্যবহার করতে না চান, তাহলে আপনি এটি আনইনস্টল করতে পারেন:

DROP FUNCTION add_numbers;

এটি add_numbers ফাংশনটি ডেটাবেস থেকে মুছে ফেলবে।


UDF তৈরি করার সময় কিছু গুরুত্বপূর্ণ বিষয়

  • লাইব্রেরি এবং ফাইল পারমিশন: UDF ফাংশন লোড করতে যে লাইব্রেরি ব্যবহার করা হচ্ছে, সেটির সঠিক পারমিশন থাকতে হবে। লাইব্রেরি ফাইলের পারমিশন সঠিক না হলে MariaDB লাইব্রেরিটি লোড করতে পারবে না।
  • কম্পাইলিং: C বা C++ কোডটি সঠিকভাবে কম্পাইল করতে হবে যাতে এটি MariaDB এর সাথে সামঞ্জস্যপূর্ণ হয়।
  • পারফরম্যান্স: UDF গুলি সাধারণত সিস্টেম লেভেল কোড হিসেবে কাজ করে, তাই এটি ডেটাবেসের পারফরম্যান্সে কিছুটা প্রভাব ফেলতে পারে। তাই শুধুমাত্র প্রয়োজনীয় ক্ষেত্রে ব্যবহার করা উচিত।
  • ডিবাগিং: কোড লিখার সময় ডিবাগিং করতে ভুলবেন না, বিশেষ করে মেমরি বা টাইপ সম্পর্কিত ত্রুটি এড়াতে।

সারাংশ

মারিয়া ডিবি (MariaDB) তে User-defined Functions (UDFs) তৈরি করে আপনি ডেটাবেসে কাস্টম ফাংশনালিটি যোগ করতে পারেন। C বা C++ তে কোড লিখে, তা কম্পাইল করে এবং মারিয়া ডিবি তে লোড করে আপনি আপনার প্রয়োজনীয় ফাংশন তৈরি করতে পারেন। এটি ডেটাবেসের কার্যকারিতা বাড়ানোর একটি শক্তিশালী উপায়, তবে এটি কিছুটা জটিল এবং সাবধানতার সাথে ব্যবহার করা উচিত।

Content added By

Triggers (ট্রিগার) হল ডেটাবেসের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা নির্দিষ্ট ইভেন্ট বা কার্যক্রমের সময় স্বয়ংক্রিয়ভাবে কার্যকর হয়। অর্থাৎ, ট্রিগার একটি বিশেষ ধরনের সংরক্ষিত প্রক্রিয়া যা ডেটাবেসের উপর কোন নির্দিষ্ট পরিবর্তন (যেমন, INSERT, UPDATE, বা DELETE) ঘটলে তা স্বয়ংক্রিয়ভাবে কার্যকর হয়। মারিয়া ডিবি (MariaDB) তে ট্রিগার ব্যবহারের মাধ্যমে আপনি ডেটাবেসের বিভিন্ন ক্রিয়াকলাপের ওপর নিয়ন্ত্রণ রাখতে পারেন এবং কিছু স্বয়ংক্রিয় কাজ পরিচালনা করতে পারেন।


Trigger কী?

Trigger একটি ধরনের stored procedure (সংরক্ষিত প্রক্রিয়া), যা ডেটাবেসের উপর নির্দিষ্ট ক্রিয়াকলাপ বা ইভেন্ট ঘটলে স্বয়ংক্রিয়ভাবে কার্যকর হয়। ট্রিগারটি সাধারণত INSERT, UPDATE, বা DELETE ইভেন্টের সাথে সম্পর্কিত থাকে।

ট্রিগার কীভাবে কাজ করে?

  • ট্রিগার নির্দিষ্ট একটি টেবিলের ওপর নির্দিষ্ট ইভেন্ট (যেমন, ডেটা ইন্সার্ট করা, মডিফাই করা বা ডিলিট করা) ঘটলেই এটি স্বয়ংক্রিয়ভাবে চালু হয়।
  • এটি সাধারণত ডেটাবেসের এক বা একাধিক রেকর্ডে পরিবর্তন করার জন্য ব্যবহৃত হয়।
  • ট্রিগারটি প্রক্রিয়া শুরু করার আগে বা পরে কার্যকর হতে পারে, যা নির্ভর করে যে আপনি ট্রিগারটিকে BEFORE বা AFTER হিসেবে সংজ্ঞায়িত করেছেন।

Trigger তৈরি করার সিনট্যাক্স

মারিয়া ডিবি তে ট্রিগার তৈরি করতে নিচের সাধারণ সিনট্যাক্স ব্যবহার করা হয়:

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
   -- trigger body (SQL statements)
END;

এখানে:

  • trigger_name: ট্রিগারের নাম।
  • BEFORE | AFTER: ট্রিগারটি কি ইভেন্টের আগে (BEFORE) অথবা পরে (AFTER) কাজ করবে তা নির্ধারণ করে।
  • INSERT | UPDATE | DELETE: ট্রিগারটি কোন ইভেন্টের জন্য কাজ করবে তা নির্ধারণ করে।
  • table_name: যে টেবিলের উপর ট্রিগারটি কাজ করবে।
  • FOR EACH ROW: প্রতিটি রো-তে পরিবর্তন ঘটলে ট্রিগারটি কার্যকর হবে।
  • trigger body: ট্রিগারের শরীর, যেখানে আপনি SQL স্টেটমেন্ট লিখবেন।

উদাহরণ: ট্রিগারের ব্যবহার

১. BEFORE INSERT Trigger

ধরা যাক, একটি employees টেবিল রয়েছে এবং আপনি চান যে নতুন একটি কর্মচারী যোগ করার আগে, তাদের বেতন যদি ২০,০০০-এর কম হয়, তবে তাদের বেতন ২০,০০০ এ আপডেট হয়ে যাবে। এটি করার জন্য একটি BEFORE INSERT ট্রিগার তৈরি করা হবে।

CREATE TRIGGER before_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary < 20000 THEN
        SET NEW.salary = 20000;
    END IF;
END;

এটি একটি BEFORE INSERT ট্রিগার, যা যখনই একটি নতুন কর্মচারী employees টেবিলে যুক্ত হবে, তখন তার বেতন ২০,০০০-এর কম হলে সেটি ২০,০০০ তে আপডেট করবে।

২. AFTER UPDATE Trigger

ধরা যাক, আপনি চান যে employees টেবিলের বেতন আপডেট হওয়ার পর একটি লোগ ফাইল বা অডিট টেবিলে সেই পরিবর্তন ট্র্যাক করা হোক। এটি করার জন্য একটি AFTER UPDATE ট্রিগার ব্যবহার করা যেতে পারে।

CREATE TRIGGER after_update_salary
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO salary_audit (employee_id, old_salary, new_salary, update_time)
    VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END;

এটি একটি AFTER UPDATE ট্রিগার, যা employees টেবিলের বেতন পরিবর্তনের পর একটি salary_audit টেবিলে পুরনো এবং নতুন বেতন সহ সেই আপডেটের সময় সংরক্ষণ করবে।

৩. AFTER DELETE Trigger

ধরা যাক, আপনি employees টেবিল থেকে কোনো কর্মচারী ডিলিট হলে, সেই কর্মচারীর তথ্য deleted_employees টেবিলে স্থানান্তর করতে চান। এই কাজটি করতে একটি AFTER DELETE ট্রিগার ব্যবহার করা যাবে।

CREATE TRIGGER after_delete_employee
AFTER DELETE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO deleted_employees (employee_id, name, salary, delete_time)
    VALUES (OLD.employee_id, OLD.name, OLD.salary, NOW());
END;

এটি একটি AFTER DELETE ট্রিগার, যা employees টেবিল থেকে কোনো রেকর্ড মুছে ফেললে সেই রেকর্ডটি deleted_employees টেবিলে স্থানান্তর করবে।


Trigger-এর সুবিধা ও ব্যবহার

  1. ডেটার অখণ্ডতা বজায় রাখা
    ট্রিগার ব্যবহারের মাধ্যমে আপনি ডেটার অখণ্ডতা এবং সঠিকতা নিশ্চিত করতে পারেন। যেমন, কোনো ভুল ডেটা ইনসার্ট বা আপডেট হওয়া থেকে আটকানো।
  2. স্বয়ংক্রিয় প্রক্রিয়া
    ট্রিগার দ্বারা নির্দিষ্ট কাজগুলিকে স্বয়ংক্রিয়ভাবে সম্পাদন করা সম্ভব হয়, যেমন, লগিং, অডিটিং, বা নির্দিষ্ট শর্তের ভিত্তিতে ডেটা পরিবর্তন।
  3. ডেটাবেসের নির্ভরযোগ্যতা বৃদ্ধি
    ট্রিগার ব্যবহারের মাধ্যমে ডেটাবেসের ওপর কর্মক্ষমতার উপর নিয়ন্ত্রণ রাখা যায়, এবং ডেটাবেসের কোনো রেকর্ড ম্যানুয়ালি পরিবর্তিত হলে তা লগ করা যায়।
  4. ডুপ্লিকেট বা ভুল ইনপুট এড়ানো
    ট্রিগার ব্যবহার করে ডুপ্লিকেট বা ভুল ইনপুট সনাক্ত এবং সংশোধন করা যায়, যেমন—একটি নির্দিষ্ট কলামে ইউনিক মান থাকতে হবে এমন নিয়ম তৈরি করা।

Trigger-এর সীমাবদ্ধতা

  1. পারফরম্যান্সের প্রভাব
    ট্রিগারটি যখন কোনো ইভেন্ট ঘটানোর পর কার্যকর হয়, তখন এটি কিছু পারফরম্যান্স সমস্যা তৈরি করতে পারে, বিশেষত যদি ট্রিগারটি বড় বা জটিল হয়।
  2. ডিবাগিং সমস্যা
    ট্রিগারগুলোর কার্যকারিতা ডিবাগ করা বেশ কঠিন হতে পারে, কারণ তারা ডেটাবেসের স্বয়ংক্রিয় কাজগুলির মধ্যে চলে এবং সাধারণ কোয়েরি স্টেটমেন্টের বাইরে চলে।
  3. অনুপযুক্ত ব্যবহার
    কিছু পরিস্থিতিতে, ট্রিগার ব্যবহার অপ্রয়োজনীয় বা অতিরিক্ত জটিলতা সৃষ্টি করতে পারে। তাই টেবিলের অবস্থা বা কাজের পরিবেশ অনুসারে ট্রিগার ব্যবহারে সতর্ক থাকা উচিত।

সারাংশ

Triggers মারিয়া ডিবি (MariaDB) তে একটি শক্তিশালী টুল, যা ডেটাবেসে নির্দিষ্ট ইভেন্ট বা ক্রিয়ার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে কার্যকর হয়। INSERT, UPDATE, এবং DELETE ইভেন্টগুলির জন্য ট্রিগার ব্যবহার করা যেতে পারে, যা ডেটাবেসের পারফরম্যান্স, অডিটিং এবং ডেটা অখণ্ডতা বজায় রাখতে সাহায্য করে। তবে, ট্রিগার ব্যবহারের সময় এর পারফরম্যান্স প্রভাব এবং ডিবাগিং সমস্যা সম্পর্কে সতর্ক থাকা গুরুত্বপূর্ণ।

Content added By
Promotion

Are you sure to start over?

Loading...