১. Stored Procedure কী?
Stored Procedure হলো একটি প্রিসেট SQL কোডের সিকোয়েন্স, যা ডেটাবেজ সার্ভারে সংরক্ষিত থাকে এবং বিশেষ একটি কাজ বা ফাংশন সম্পাদন করার জন্য ব্যবহার করা হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়। Stored Procedure ব্যবহার করার ফলে বারবার SQL কুয়েরি লিখতে হয় না এবং একই ফাংশন একাধিকবার ব্যবহার করা সম্ভব হয়।
MySQLi দিয়ে Stored Procedure কল করা সম্ভব এবং এর মাধ্যমে ডেটা উদ্ধার (fetch), আপডেট বা ইনসার্ট করা যায়।
২. MySQLi দিয়ে Stored Procedure কল করা
MySQLi দিয়ে Stored Procedure কল করার জন্য কিছু ধাপ অনুসরণ করতে হয়। নিচে Stored Procedure কল করার ধাপ এবং তার রেজাল্ট হ্যান্ডল করার উদাহরণ দেওয়া হল।
২.১ Stored Procedure তৈরি করা
প্রথমে MySQL ডেটাবেজে একটি Stored Procedure তৈরি করতে হবে। উদাহরণস্বরূপ, একটি Stored Procedure তৈরি করা হলো, যা একটি নির্দিষ্ট id এর ভিত্তিতে ইউজারের নাম ও ইমেইল রিটার্ন করবে।
DELIMITER
DELIMITER ;
এই Stored Procedure GetUserDetails ইউজারের id এর মাধ্যমে তার নাম ও ইমেইল রিটার্ন করবে।
৩. MySQLi দিয়ে Stored Procedure কল করা
MySQLi দিয়ে Stored Procedure কল করার জন্য prepare() মেথড ব্যবহার করা হয় এবং ইনপুট প্যারামিটারগুলো বাইন্ড করা হয়।
৩.১ Procedural Mode দিয়ে Stored Procedure কল করা
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";
// সংযোগ স্থাপন
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Stored Procedure কল করা
$stmt = mysqli_prepare($conn, "CALL GetUserDetails(?)");
// ইনপুট প্যারামিটার বাইন্ড করা
$user_id = 1;
mysqli_stmt_bind_param($stmt, "i", $user_id);
// কুয়েরি এক্সিকিউট করা
mysqli_stmt_execute($stmt);
// রেজাল্ট সেট স্টোর করা
mysqli_stmt_store_result($stmt);
// রেজাল্টের কলাম বাইন্ড করা
mysqli_stmt_bind_result($stmt, $id, $name, $email);
// রেজাল্ট ফেচ করা
while (mysqli_stmt_fetch($stmt)) {
echo "ID: " . $id . " - Name: " . $name . " - Email: " . $email . "<br>";
}
// স্টেটমেন্ট বন্ধ করা
mysqli_stmt_close($stmt);
// সংযোগ বন্ধ করা
mysqli_close($conn);
৩.২ Object-Oriented Mode দিয়ে Stored Procedure কল করা
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testdb";
// Object-oriented সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);
// Stored Procedure কল করা
$stmt = $conn->prepare("CALL GetUserDetails(?)");
// ইনপুট প্যারামিটার বাইন্ড করা
$stmt->bind_param("i", $user_id);
// প্যারামিটার ইনপুট প্রদান
$user_id = 1;
// কুয়েরি এক্সিকিউট করা
$stmt->execute();
// রেজাল্ট সেট স্টোর করা
$stmt->store_result();
// রেজাল্টের কলাম বাইন্ড করা
$stmt->bind_result($id, $name, $email);
// রেজাল্ট ফেচ করা
while ($stmt->fetch()) {
echo "ID: " . $id . " - Name: " . $name . " - Email: " . $email . "<br>";
}
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
// সংযোগ বন্ধ করা
$conn->close();
৪. Multiple Result Sets (একাধিক রেজাল্ট) হ্যান্ডলিং
যদি Stored Procedure একাধিক রেজাল্ট রিটার্ন করে, তাহলে MySQLi এর মাধ্যমে একাধিক রেজাল্ট হ্যান্ডলিং করার প্রক্রিয়া কিছুটা ভিন্ন। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে দুটি রেজাল্ট সেট রিটার্ন করা হচ্ছে।
৪.১ Multiple Result Sets Handling
$stmt = $conn->prepare("CALL GetMultipleResults()");
// কুয়েরি এক্সিকিউট করা
$stmt->execute();
// প্রথম রেজাল্ট সেট স্টোর করা
$stmt->store_result();
// প্রথম রেজাল্ট বাইন্ড করা
$stmt->bind_result($id, $name);
// প্রথম রেজাল্ট ফেচ করা
while ($stmt->fetch()) {
echo "ID: $id, Name: $name <br>";
}
// দ্বিতীয় রেজাল্ট সেটের জন্য রেজাল্ট পান
$stmt->next_result();
// দ্বিতীয় রেজাল্ট স্টোর করা
$stmt->store_result();
// দ্বিতীয় রেজাল্ট বাইন্ড করা
$stmt->bind_result($email);
// দ্বিতীয় রেজাল্ট ফেচ করা
while ($stmt->fetch()) {
echo "Email: $email <br>";
}
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
এই ক্ষেত্রে, Stored Procedure দুটি আলাদা রেজাল্ট সেট রিটার্ন করবে এবং আমরা next_result() মেথড ব্যবহার করে পরবর্তী রেজাল্ট সেটে প্রবেশ করব।
৫. Output Parameters ব্যবহার
บาง সময় Stored Procedure তে আউটপুট প্যারামিটার (Output Parameters) ব্যবহার করা হয়, যেগুলি স্টোরড প্রসিডিউর সম্পন্ন করার পরে ফিরে আসে। MySQLi এ এটি হ্যান্ডল করতে কিছুটা আলাদা পদ্ধতি রয়েছে।
৫.১ Output Parameters সহ Stored Procedure
DELIMITER
DELIMITER ;
এই Stored Procedure total_count আউটপুট প্যারামিটার হিসেবে ইউজারদের সংখ্যা রিটার্ন করবে।
৫.২ MySQLi দিয়ে Output Parameters Handling
$stmt = $conn->prepare("CALL GetUserCount(?)");
// আউটপুট প্যারামিটার বাইন্ড করা
$stmt->bind_param("i", $total_count);
// কুয়েরি এক্সিকিউট করা
$stmt->execute();
// আউটপুট প্যারামিটার ফেচ করা
$stmt->bind_result($total_count);
$stmt->fetch();
// আউটপুট প্রদর্শন
echo "Total Users: " . $total_count;
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
৬. Prepared Statements এবং Stored Procedures এর সুবিধা
- নিরাপত্তা: SQL ইনজেকশন আক্রমণ থেকে রক্ষা পাওয়ার জন্য Prepared Statements নিরাপদ উপায়।
- পারফরম্যান্স: একবার Stored Procedure তৈরি করলে, তা পুনঃব্যবহার করা যায় এবং বারবার SQL কুয়েরি পাঠানোর প্রয়োজন হয় না।
- কোডের পুনঃব্যবহারযোগ্যতা: Stored Procedure কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।
- ডেটাবেজের চাপ কমানো: একাধিক কাজ বা কুয়েরি একত্রে ডেটাবেজে প্রক্রিয়া করা যায়।
MySQLi দিয়ে Stored Procedure এর রেজাল্ট হ্যান্ডলিং করা একটি শক্তিশালী ও নিরাপদ পদ্ধতি। এটি SQL ইনজেকশন প্রতিরোধে সাহায্য করে, পারফরম্যান্সে উন্নতি আনে এবং ডেটাবেজ অপারেশনগুলিকে আরও কার্যকর ও সংগঠিত করে তোলে। MySQLi তে Stored Procedure ব্যবহার করে ডেটা রিট্রিভাল, ইনসার্ট, আপডেট এবং অন্যান্য কমপ্লেক্স অপারেশন খুব সহজে এবং নিরাপদে সম্পন্ন করা যায়।