CallableStatement (Stored Procedures)

Java Technologies - জেডিবিসি (JDBC)
200

JDBC (Java Database Connectivity) হল Java ডেভেলপারদের জন্য একটি API যা ডেটাবেসের সাথে যোগাযোগ করতে সহায়তা করে। CallableStatement JDBC এর একটি গুরুত্বপূর্ণ ইন্টারফেস, যা Stored Procedures চালানোর জন্য ব্যবহৃত হয়। Stored Procedures হল ডেটাবেসে সংরক্ষিত SQL কুয়েরি বা লজিক্যাল প্রোগ্রাম যা ডেটাবেসে একাধিক কার্যকলাপ সম্পাদন করতে পারে এবং সেগুলিকে সহজে পুনঃব্যবহারযোগ্য করে তোলে।

এখানে, আমরা CallableStatement এর ব্যবহার, এর সুবিধা, এবং উদাহরণ সহ আলোচনা করব।


1. CallableStatement কী?

CallableStatement হল একটি JDBC ইন্টারফেস যা SQL কুয়েরি বা স্টোরড প্রসিডিওর (Stored Procedure) ডেটাবেসে এক্সিকিউট করতে ব্যবহৃত হয়। এটি PreparedStatement এর একটি বিস্তৃত সংস্করণ, যেখানে আপনি SQL স্টেটমেন্টের পরিবর্তে ডেটাবেসের একটি স্টোরড প্রসিডিওর চালাতে পারেন।

Stored Procedure হল ডেটাবেসের মধ্যে এক ধরণের প্রোগ্রাম বা সাবরুটিন যা এক বা একাধিক SQL স্টেটমেন্ট ধারণ করে। যখন একটি স্টোরড প্রসিডিওর তৈরি হয়, তখন সেটি ডেটাবেসে সংরক্ষিত থাকে এবং পরবর্তীতে পুনঃব্যবহারযোগ্য হয়।


2. Stored Procedure কী?

Stored Procedure হল একটি প্রি-কাম্পাইলড SQL ব্লক যা একটি ডেটাবেস সার্ভারে সংরক্ষিত থাকে এবং ডেটাবেস থেকে এক্সিকিউট করা যেতে পারে। এটি প্রোগ্রামিং ভাষা বা SQL স্টেটমেন্টের মাধ্যমে একাধিক কার্যক্রম সম্পাদন করতে পারে।

Stored Procedure এর উদাহরণ:

DELIMITER CREATEPROCEDUREgetEmployeeDetails(INempIdINT)BEGINSELECTid,name,salaryFROMemployeesWHEREid=empId;END

CREATE PROCEDURE getEmployeeDetails(IN empId INT)
BEGIN
    SELECT id, name, salary FROM employees WHERE id = empId;
END

DELIMITER ;

এই stored procedureটি ডেটাবেসে সংরক্ষিত হয়েছে এবং নির্দিষ্ট empId পাঠালে সংশ্লিষ্ট কর্মচারীর id, name, এবং salary ফিরিয়ে দেবে।


3. CallableStatement ব্যবহার

CallableStatement এর মাধ্যমে আপনি একটি স্টোরড প্রসিডিওর কল করতে পারেন এবং তার ইনপুট আর্গুমেন্ট এবং আউটপুট ফলাফল সংগ্রহ করতে পারেন। এটি IN, OUT, এবং INOUT প্যারামিটার সাপোর্ট করে।

3.1 CallableStatement এর মাধ্যমে Stored Procedure কল করা

এখানে আমরা একটি উদাহরণ দেখব, যেখানে CallableStatement ব্যবহার করে একটি স্টোরড প্রসিডিওর কল করা হচ্ছে।

উদাহরণ: Stored Procedure কল করা

ধরা যাক আমাদের একটি স্টোরড প্রসিডিওর রয়েছে যা empId দিয়ে কর্মচারীর বিস্তারিত তথ্য প্রাপ্ত করে:

CREATE PROCEDURE getEmployeeDetails(IN empId INT)
BEGIN
    SELECT id, name, salary FROM employees WHERE id = empId;
END;

এখন, JDBC CallableStatement ব্যবহার করে এই স্টোরড প্রসিডিওরটি কল করা হবে।

import java.sql.*;

public class CallableStatementExample {

    public static void main(String[] args) {
        // ডেটাবেসের সংযোগ তথ্য
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        // SQL কুয়েরি (Stored Procedure কল করা)
        String query = "{CALL getEmployeeDetails(?)}";

        try (Connection connection = DriverManager.getConnection(url, username, password)) {

            // CallableStatement তৈরি করা
            CallableStatement callableStatement = connection.prepareCall(query);

            // প্যারামিটার সেট করা
            callableStatement.setInt(1, 101); // empId = 101

            // কুইরি এক্সিকিউট করা এবং ফলাফল রিটার্ন করা
            ResultSet resultSet = callableStatement.executeQuery();

            // ফলাফল প্রক্রিয়াকরণ
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                double salary = resultSet.getDouble("salary");
                System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
            }

            // রিসোর্স বন্ধ করা
            resultSet.close();
            callableStatement.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. CallableStatement তৈরি করা হয়েছে এবং SQL স্টেটমেন্ট {CALL getEmployeeDetails(?)} ব্যবহার করা হয়েছে। এখানে ? হল ইনপুট প্যারামিটার।
  2. setInt(1, 101) মেথড ব্যবহার করে empId প্যারামিটার এর মান 101 সেট করা হয়েছে।
  3. executeQuery() মেথড ব্যবহার করে কুইরি এক্সিকিউট করা হয়েছে এবং ResultSet থেকে ফলাফল রিট্রাইভ করা হয়েছে।

4. CallableStatement এর মাধ্যমে IN, OUT, এবং INOUT প্যারামিটার ব্যবহার

IN, OUT, এবং INOUT প্যারামিটারগুলি Stored Procedure তে ব্যবহৃত হয়। IN প্যারামিটার মান ইনপুট হিসেবে প্রদান করা হয়, OUT প্যারামিটার মান আউটপুট হিসেবে ফেরত দেয় এবং INOUT প্যারামিটার উভয় কাজ করতে পারে।

4.1 IN Parameter

এটি ইনপুট প্যারামিটার হিসেবে ব্যবহৃত হয়, যার মান আপনি setXXX() মেথড দিয়ে সেট করেন।

CallableStatement stmt = connection.prepareCall("{CALL getEmployeeDetails(?)}");
stmt.setInt(1, 101);  // IN প্যারামিটার

4.2 OUT Parameter

এটি আউটপুট প্যারামিটার হিসেবে ব্যবহৃত হয় এবং ডেটাবেস থেকে ফেরত আসা মান আপনি registerOutParameter() এবং getXXX() মেথড ব্যবহার করে পান।

CallableStatement stmt = connection.prepareCall("{CALL getEmployeeSalary(?, ?)}");
stmt.setInt(1, 101);  // IN প্যারামিটার
stmt.registerOutParameter(2, Types.DOUBLE);  // OUT প্যারামিটার
stmt.execute();
double salary = stmt.getDouble(2);  // OUT প্যারামিটার থেকে মান পড়া

4.3 INOUT Parameter

এটি ইনপুট ও আউটপুট উভয় কাজ করে। আপনি প্রথমে একটি ইনপুট মান সেট করেন, পরে সেটি আউটপুট হিসেবে ফেরত পাবেন।

CallableStatement stmt = connection.prepareCall("{CALL updateEmployeeSalary(?, ?)}");
stmt.setInt(1, 101);  // IN প্যারামিটার
stmt.setDouble(2, 50000);  // INOUT প্যারামিটার (salary)
stmt.registerOutParameter(2, Types.DOUBLE);  // OUT প্যারামিটার হিসেবে নিবন্ধন
stmt.execute();
double updatedSalary = stmt.getDouble(2);  // INOUT প্যারামিটার থেকে আপডেট করা মান পড়া

5. CallableStatement এর সুবিধা

  1. SQL Injection থেকে সুরক্ষা: CallableStatement SQL ইনজেকশনের বিরুদ্ধে সুরক্ষা প্রদান করে, কারণ SQL কুয়েরি এবং প্যারামিটার আলাদা থাকে।
  2. Performance Optimization: স্টোরড প্রসিডিওর একবার কম্পাইল হয়ে ডেটাবেসে সংরক্ষিত থাকে, তাই একাধিকবার কল করা হলে এটি পারফরম্যান্স বৃদ্ধি করে।
  3. Code Reusability: একটি স্টোরড প্রসিডিওর একবার তৈরি হয়ে ডেটাবেসে সংরক্ষিত হলে, তা বিভিন্ন অ্যাপ্লিকেশনে পুনরায় ব্যবহৃত হতে পারে।

6. Conclusion

CallableStatement JDBC-এর মাধ্যমে Stored Procedures চালানোর একটি অত্যন্ত কার্যকরী উপায়। এটি ডেটাবেসের সাথে আরও কার্যকরী এবং নিরাপদ যোগাযোগ নিশ্চিত করে, বিশেষ করে যখন আপনি ডেটাবেসের জটিল লজিক এবং স্টোরড প্রসিডিওর ব্যবহার করছেন। SQL ইনজেকশন প্রতিরোধ, পারফরম্যান্স অপ্টিমাইজেশন এবং কোড পুনঃব্যবহারযোগ্যতার মতো সুবিধাগুলি CallableStatement কে JDBC প্রোগ্রামিংয়ে একটি গুরুত্বপূর্ণ অংশ করে তোলে।

Content added By

CallableStatement কি এবং কেন প্রয়োজন?

261

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

CallableStatement এর প্রধান উদ্দেশ্য:

  1. স্টোরড প্রোসিজার এবং ফাংশন কল করা: এটি JDBC ব্যবহার করে ডেটাবেসে থাকা স্টোরড প্রোসিজার বা ফাংশন চালাতে সহায়তা করে।
  2. প্যারামিটারাইজড কুইরি: CallableStatement প্যারামিটারাইজড স্টেটমেন্ট তৈরি করতে সহায়তা করে, যার মাধ্যমে আপনি ডায়নামিকভাবে স্টোরড প্রোসিজারে প্যারামিটার পাঠাতে পারেন।
  3. ফলাফল ফিরে আনা: এটি স্টোরড প্রোসিজার বা ফাংশন থেকে প্রাপ্ত ফলাফল (যেমন ResultSet, আউটপুট প্যারামিটার) ফিরে আনার জন্য ব্যবহৃত হয়।

1. CallableStatement ব্যবহারের উদাহরণ

ধরা যাক, ডেটাবেসে একটি স্টোরড প্রোসিজার রয়েছে যার নাম getEmployeeDetails এবং এটি দুটি আউটপুট প্যারামিটার নেবে এবং একটি ResultSet রিটার্ন করবে।

উদাহরণ: Stored Procedure কল করা

ধরি আমাদের ডেটাবেসে একটি স্টোরড প্রোসিজার আছে যেটি একটি নির্দিষ্ট employee_id এর জন্য কর্মচারীর নাম এবং বেতন রিটার্ন করে।

CREATE PROCEDURE getEmployeeDetails (IN emp_id INT, OUT emp_name VARCHAR(100), OUT emp_salary DECIMAL)
BEGIN
    SELECT name, salary INTO emp_name, emp_salary FROM employees WHERE id = emp_id;
END;

এখন, CallableStatement ব্যবহার করে আমরা Java থেকে এই স্টোরড প্রোসিজার কল করব।

উদাহরণ কোড:

import java.sql.*;

public class CallableStatementExample {
    public static void main(String[] args) {
        // ডেটাবেস সংযোগের তথ্য
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        // CallableStatement এবং ResultSet
        try (Connection conn = DriverManager.getConnection(jdbcURL, username, password)) {
            // স্টোরড প্রোসিজার কল করার SQL স্টেটমেন্ট
            String sql = "{CALL getEmployeeDetails(?, ?, ?)}";

            // CallableStatement তৈরি করা
            CallableStatement stmt = conn.prepareCall(sql);

            // ইনপুট প্যারামিটার সেট করা
            stmt.setInt(1, 101);  // employee_id এর মান 101 সেট করা

            // আউটপুট প্যারামিটার সেট করা (নির্ধারণ)
            stmt.registerOutParameter(2, Types.VARCHAR);  // emp_name আউটপুট
            stmt.registerOutParameter(3, Types.DECIMAL);  // emp_salary আউটপুট

            // প্রোসিজার এক্সিকিউট করা
            stmt.execute();

            // আউটপুট প্যারামিটার থেকে মান নিয়ে আসা
            String name = stmt.getString(2);  // emp_name
            double salary = stmt.getDouble(3);  // emp_salary

            // ফলাফল প্রিন্ট করা
            System.out.println("Employee Name: " + name);
            System.out.println("Employee Salary: " + salary);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. SQL স্টেটমেন্ট: {CALL getEmployeeDetails(?, ?, ?)} স্টোরড প্রোসিজার কল করার জন্য সঠিক সিনট্যাক্স।
  2. প্যারামিটার সেট করা:
    • setInt(1, 101) দ্বারা ইনপুট প্যারামিটার emp_id সেট করা হয়েছে।
    • registerOutParameter(2, Types.VARCHAR) এবং registerOutParameter(3, Types.DECIMAL) দ্বারা আউটপুট প্যারামিটার সেট করা হয়েছে।
  3. execute(): execute() মেথড ব্যবহার করে প্রোসিজার চালানো হয়েছে।
  4. getString() এবং getDouble(): আউটপুট প্যারামিটার থেকে মান নিয়ে আসার জন্য এই মেথডগুলি ব্যবহার করা হয়েছে।

2. CallableStatement এর সুবিধা এবং ব্যবহার

2.1. SQL Injection প্রতিরোধ

CallableStatement প্যারামিটারাইজড কুইরি ব্যবহার করার কারণে SQL ইনজেকশনের ঝুঁকি কমিয়ে দেয়। এর মাধ্যমে আপনি SQL কুয়েরি সরাসরি স্ট্রিংয়ে যোগ না করে, ইনপুট প্যারামিটার ব্যবহার করে নিরাপদে ডেটাবেসে কাজ করতে পারেন।

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

CallableStatement আপনাকে ডেটাবেসে সংরক্ষিত স্টোরড প্রোসিজার বা ফাংশনগুলি কল করতে দেয়। এটি ডেটাবেসে জটিল লজিক এবং অপারেশন সরাসরি চালাতে সহায়তা করে, যা অ্যাপ্লিকেশন স্তরের কোড থেকে পৃথক থাকে।

2.3. আউটপুট প্যারামিটার ব্যবহার

আপনি CallableStatement ব্যবহার করে আউটপুট প্যারামিটার এবং ইনপুট প্যারামিটার একযোগে ব্যবহার করতে পারেন। এটি একাধিক আউটপুট মান ফিরিয়ে আনতে সক্ষম করে।

2.4. ফলাফল (ResultSet) ফিরিয়ে আনা

এছাড়া, যদি স্টোরড প্রোসিজার ResultSet রিটার্ন করে, তবে আপনি এটি executeQuery() মেথডের মাধ্যমে ফেরত পেতে পারেন।

ResultSet resultSet = stmt.executeQuery();

3. CallableStatement এর সীমাবদ্ধতা

3.1. ডেটাবেস নির্ভরশীলতা

স্টোরড প্রোসিজার ডেটাবেস নির্ভরশীল হতে পারে। যেমন, MySQL এবং Oracle এর স্টোরড প্রোসিজারের সিনট্যাক্সের মধ্যে পার্থক্য থাকতে পারে। এজন্য, এটি এক ডেটাবেসের জন্য কাজ করলেও অন্য ডেটাবেসের সাথে কাজ নাও করতে পারে।

3.2. স্টোরড প্রোসিজার ডিবাগিং

স্টোরড প্রোসিজার এবং ফাংশনের মধ্যে ভুল খুঁজে বের করা কখনও কখনও জটিল হতে পারে, বিশেষত যখন স্টোরড প্রোসিজার জটিল লজিকের সাথে কাজ করে।


সারাংশ

CallableStatement JDBC এর একটি শক্তিশালী ইন্টারফেস যা স্টোরড প্রোসিজার এবং ফাংশন ডেটাবেসে এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি প্যারামিটারাইজড কুইরি ব্যবহার করে SQL ইনজেকশন প্রতিরোধে সহায়তা করে এবং ডেটাবেসের সাথে আরও সুরক্ষিত এবং কার্যকরীভাবে যোগাযোগ স্থাপন করতে পারে। CallableStatement আউটপুট প্যারামিটার এবং ResultSet ব্যবহার করার মাধ্যমে স্টোরড প্রোসিজার বা ফাংশন থেকে ফলাফল ফিরিয়ে আনে। এটি যখন আপনি কমপ্লেক্স ডেটাবেস অপারেশন পরিচালনা করতে চান এবং কোডে ডেটাবেস লজিক আলাদা করতে চান তখন ব্যবহার করা হয়।

Content added By

Stored Procedure কল করা এবং ResultSet Management

243

JDBC (Java Database Connectivity) ব্যবহার করে আপনি Stored Procedure কল করতে পারেন এবং তাদের রিটার্ন করা ডেটা, অর্থাৎ ResultSet পরিচালনা করতে পারেন। Stored Procedure হল ডেটাবেসে সংরক্ষিত SQL কোডের একটি সেট যা একাধিক SQL কুইরি এক্সিকিউট করতে ব্যবহৃত হয়। এটি ডেটাবেসের পারফরম্যান্স উন্নত করতে সহায়ক হতে পারে এবং কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সাহায্য করে।

এই গাইডে আমরা দেখব কীভাবে JDBC ব্যবহার করে Stored Procedure কল করা যায় এবং ResultSet কে সঠিকভাবে ম্যানেজ করা হয়।


1. Stored Procedure কল করা

Stored Procedure হল ডেটাবেসের মধ্যে সংরক্ষিত একটি প্রোগ্রাম যা একাধিক SQL কুয়েরি একত্রে প্রক্রিয়া করতে পারে। আপনি CallableStatement ব্যবহার করে JDBC-তে Stored Procedure কল করতে পারেন।

1.1 Stored Procedure কল করার উদাহরণ

ধরা যাক, আমাদের একটি Employee টেবিল রয়েছে এবং আমাদের ডেটাবেসে একটি Stored Procedure আছে যার নাম getEmployeeById, যা একটি নির্দিষ্ট id এর ভিত্তিতে Employee ডেটা রিটার্ন করে।

CREATE PROCEDURE getEmployeeById(IN emp_id INT)
BEGIN
    SELECT * FROM employees WHERE id = emp_id;
END;

এই Stored Procedure কল করতে হবে JDBC ব্যবহার করে।

1.2 Stored Procedure কল করার উদাহরণ:

import java.sql.*;

public class StoredProcedureExample {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        
        try (Connection connection = DriverManager.getConnection(jdbcURL, username, password)) {
            // Stored Procedure কল করার জন্য CallableStatement ব্যবহার করা
            String sql = "{call getEmployeeById(?)}";
            CallableStatement callableStatement = connection.prepareCall(sql);

            // ইনপুট প্যারামিটার সেট করা (Employee ID)
            callableStatement.setInt(1, 101);

            // ResultSet রিটার্ন করা এবং ডেটা প্রক্রিয়া করা
            ResultSet resultSet = callableStatement.executeQuery();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                double salary = resultSet.getDouble("salary");
                System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
            }

            resultSet.close();
            callableStatement.close();
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. CallableStatement: CallableStatement ব্যবহৃত হয়েছে স্টোরড প্রসিডিউর কল করার জন্য।
  2. setInt(): প্রথম প্যারামিটার emp_id হিসেবে স্টোরড প্রসিডিউরে মান প্রদান করা হয়েছে।
  3. executeQuery(): executeQuery() মেথড ব্যবহার করে স্টোরড প্রসিডিউর চালানো হয়েছে এবং তার ফলস্বরূপ ResultSet রিটার্ন করা হয়েছে।
  4. ResultSet: ResultSet ব্যবহার করে ফেচ করা ডেটার উপর কাজ করা হয়েছে।

2. ResultSet Management

ResultSet হল সেই অবজেক্ট যা SQL কুয়েরি বা Stored Procedure থেকে প্রাপ্ত ফলাফল ধারণ করে। ResultSet ব্যবহার করার সময় কিছু গুরুত্বপূর্ণ বিষয় রয়েছে, যেমন ResultSet এর নেভিগেশন, ডেটার এক্সেস, এবং রিসোর্স ম্যানেজমেন্ট।

2.1 ResultSet Navigation

ResultSet এর মধ্যে নেভিগেট করতে আপনি next(), previous(), first(), এবং last() মেথড ব্যবহার করতে পারেন।

উদাহরণ:

// Navigating through ResultSet using next() method
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}

2.2 Retrieving Data from ResultSet

ResultSet থেকে ডেটা রিট্রাইভ করার জন্য getXXX() মেথড ব্যবহার করা হয়, যেমন getInt(), getString(), getDouble() ইত্যাদি।

উদাহরণ:

int id = resultSet.getInt("id");        // Integer value
String name = resultSet.getString("name");  // String value
double salary = resultSet.getDouble("salary");  // Double value

2.3 Handling NULL Values in ResultSet

ResultSet থেকে কোনো কলামের মান NULL হলে, সেক্ষেত্রে getXXX() মেথড null রিটার্ন করবে। যদি আপনি NULL মান চেক করতে চান, তবে wasNull() মেথড ব্যবহার করতে পারেন।

String name = resultSet.getString("name");
if (resultSet.wasNull()) {
    System.out.println("Name is NULL");
} else {
    System.out.println("Name: " + name);
}

2.4 Closing ResultSet and Other Resources

ResultSet এবং অন্যান্য JDBC রিসোর্স যেমন Statement এবং Connection সবসময় বন্ধ করা উচিত, যাতে মেমরি লিক না হয়।

resultSet.close();
callableStatement.close();
connection.close();

3. Handling Multiple ResultSets from Stored Procedure

একটি Stored Procedure একাধিক ResultSet ফেরত দিতে পারে। এই ক্ষেত্রে, getMoreResults() মেথড ব্যবহার করে পরবর্তী ResultSet অ্যাক্সেস করা যায়।

উদাহরণ: Multiple ResultSets from Stored Procedure

import java.sql.*;

public class MultipleResultSetExample {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(jdbcURL, username, password)) {
            String sql = "{call getEmployeesAndDepartments()}";
            CallableStatement callableStatement = connection.prepareCall(sql);

            // Stored Procedure Call
            boolean hasResults = callableStatement.execute();

            // Process the first ResultSet (Employees)
            if (hasResults) {
                ResultSet resultSet1 = callableStatement.getResultSet();
                while (resultSet1.next()) {
                    int id = resultSet1.getInt("id");
                    String name = resultSet1.getString("name");
                    System.out.println("Employee ID: " + id + ", Name: " + name);
                }
            }

            // Check and process next ResultSet (Departments)
            if (callableStatement.getMoreResults()) {
                ResultSet resultSet2 = callableStatement.getResultSet();
                while (resultSet2.next()) {
                    int id = resultSet2.getInt("id");
                    String department = resultSet2.getString("department_name");
                    System.out.println("Department ID: " + id + ", Department: " + department);
                }
            }

            callableStatement.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • প্রথম ResultSet (getEmployeesAndDepartments()) প্রক্রিয়া করা হয়েছে, তারপর getMoreResults() ব্যবহার করে পরবর্তী ResultSet (Departments) প্রক্রিয়া করা হয়েছে।

সারাংশ

JDBC Stored Procedure কল করা এবং ResultSet ম্যানেজমেন্ট হল ডেটাবেসের সাথে যোগাযোগ করার একটি গুরুত্বপূর্ণ দিক। CallableStatement ব্যবহার করে আপনি Stored Procedure কল করতে পারেন এবং ResultSet এর মাধ্যমে প্রাপ্ত ডেটার উপর কাজ করতে পারেন। ResultSet এর সঠিক নেভিগেশন, ডেটা এক্সেস, এবং রিসোর্স ম্যানেজমেন্ট পারফরম্যান্স উন্নত করতে সাহায্য করে। একাধিক ResultSet পরিচালনা করার জন্য getMoreResults() এবং getResultSet() মেথড ব্যবহার করা যেতে পারে। এই সমস্ত কৌশল ডেটাবেসের সাথে কার্যকরভাবে ইন্টারঅ্যাক্ট করতে সহায়ক।

Content added By

IN, OUT, এবং INOUT Parameters এর ব্যবহার

290

JDBC (Java Database Connectivity) API ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয় এবং এটি SQL কুয়েরি চালানোর জন্য PreparedStatement ব্যবহার করার সুযোগ প্রদান করে। IN, OUT, এবং INOUT প্যারামিটারগুলি Stored Procedures এবং PreparedStatements-এ ব্যবহৃত হয় ডেটাবেসের সাথে যোগাযোগ করার জন্য, যা SQL কুয়েরির মধ্যে প্যারামিটারিক ডেটা অন্তর্ভুক্ত করে।

  • IN parameters: কেবল ইনপুট প্যারামিটার হিসেবে ব্যবহার হয় (জাভা প্রোগ্রাম থেকে ডেটাবেসে ডেটা পাঠাতে)।
  • OUT parameters: কেবল আউটপুট প্যারামিটার হিসেবে ব্যবহার হয় (ডেটাবেস থেকে ফলাফল রিটার্ন করতে)।
  • INOUT parameters: ইনপুট এবং আউটপুট উভয় হিসেবেই ব্যবহৃত হয় (যা ইনপুট হিসেবে পাঠানো হয় এবং পরে পরিবর্তিত হয়ে আউটপুট হিসেবে রিটার্ন হয়)।

এখানে, আমরা IN, OUT, এবং INOUT প্যারামিটারগুলির ব্যবহার এবং তাদের কোড উদাহরণ দেখাব।


1. IN Parameters

IN parameters হল সেই প্যারামিটার যেগুলি PreparedStatement বা Stored Procedure-এ ডেটাবেসে পাঠানোর জন্য ব্যবহৃত হয়। সাধারণত IN parameters এর মাধ্যমে আমরা SQL কুয়েরি বা স্টোরড প্রোসিজারের ইনপুট ডেটা প্রদান করি।

উদাহরণ:

যদি আমরা একটি PreparedStatement ব্যবহার করি, যেখানে একটি IN parameter হিসাবে id পাঠানো হচ্ছে:

import java.sql.*;

public class JdbcInParameterExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try {
            Connection conn = DriverManager.getConnection(url, username, password);
            String sql = "SELECT name, age FROM employees WHERE id = ?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            
            // IN parameter সেট করা
            stmt.setInt(1, 101); // প্রথম প্যারামিটার (id) 101 হিসেবে সেট করা
            
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("Name: " + name + ", Age: " + age);
            }
            rs.close();
            stmt.close();
            conn.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

এখানে, id হল IN parameter এবং এটি PreparedStatement এর মাধ্যমে SQL কুয়েরিতে পাঠানো হয়েছে। stmt.setInt(1, 101) ব্যবহার করে IN parameter কে সেট করা হয়েছে।


2. OUT Parameters

OUT parameters হল সেই প্যারামিটার যেগুলি স্টোরড প্রোসিজার থেকে আউটপুট হিসেবে ডেটা ফেরত নিয়ে আসে। আপনি CallableStatement ব্যবহার করে OUT parameters সংগ্রহ করতে পারেন।

উদাহরণ:

ধরা যাক, একটি স্টোরড প্রোসিজার রয়েছে যা OUT parameter হিসেবে একটি total_salary রিটার্ন করে:

DELIMITER CREATEPROCEDUREGetTotalSalary(INempidINT,OUTtotalsalaryDECIMAL)BEGINSELECTSUM(salary)INTOtotalsalaryFROMemployeesWHEREid=empid;END

CREATE PROCEDURE GetTotalSalary (IN emp_id INT, OUT total_salary DECIMAL)
BEGIN
    SELECT SUM(salary) INTO total_salary FROM employees WHERE id = emp_id;
END

DELIMITER ;

এখন, Java কোডে এই স্টোরড প্রোসিজার কল করা হবে:

import java.sql.*;

public class JdbcOutParameterExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try {
            Connection conn = DriverManager.getConnection(url, username, password);
            String sql = "{CALL GetTotalSalary(?, ?)}";
            CallableStatement stmt = conn.prepareCall(sql);

            // IN parameter সেট করা
            stmt.setInt(1, 101); // Employee ID

            // OUT parameter সেট করা
            stmt.registerOutParameter(2, Types.DECIMAL); // Total salary as OUT parameter

            stmt.execute();
            
            // OUT parameter থেকে মান রিট্রাইভ করা
            double totalSalary = stmt.getDouble(2);
            System.out.println("Total Salary: " + totalSalary);

            stmt.close();
            conn.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

এখানে, stmt.registerOutParameter(2, Types.DECIMAL) দ্বারা OUT parameter রেজিস্টার করা হয়েছে এবং stmt.getDouble(2) এর মাধ্যমে আউটপুট ডেটা পাওয়া যাচ্ছে।


3. INOUT Parameters

INOUT parameters হল প্যারামিটার যেগুলি ইনপুট হিসেবে ডেটা গ্রহণ করে এবং পরবর্তীতে আউটপুট হিসেবে ফলাফল প্রদান করে। আপনি CallableStatement ব্যবহার করে এই প্যারামিটারটি সেট করতে পারেন। এটি IN এবং OUT উভয় হিসেবে কাজ করে।

উদাহরণ:

ধরা যাক, একটি স্টোরড প্রোসিজার রয়েছে যা একটি INOUT parameter ব্যবহার করে। এই প্রোসিজারটি ইনপুট হিসাবে একটি বোনাসের মান নেয় এবং সঠিকভাবে তার সাথে salary যোগ করে আউটপুট প্রদান করে।

DELIMITER CREATEPROCEDUREUpdateSalary(INOUTempidINT,INOUTsalaryDECIMAL)BEGINUPDATEemployeesSETsalary=salary+1000WHEREid=empid;SELECTsalaryINTOsalaryFROMemployeesWHEREid=empid;END

CREATE PROCEDURE UpdateSalary (INOUT emp_id INT, INOUT salary DECIMAL)
BEGIN
    UPDATE employees SET salary = salary + 1000 WHERE id = emp_id;
    SELECT salary INTO salary FROM employees WHERE id = emp_id;
END

DELIMITER ;

Java কোডের মাধ্যমে INOUT parameter ব্যবহার করা হবে:

import java.sql.*;

public class JdbcInOutParameterExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try {
            Connection conn = DriverManager.getConnection(url, username, password);
            String sql = "{CALL UpdateSalary(?, ?)}";
            CallableStatement stmt = conn.prepareCall(sql);

            // INOUT parameter সেট করা
            stmt.setInt(1, 101); // Employee ID
            stmt.setDouble(2, 5000.0); // Initial salary

            // INOUT parameter রেজিস্টার করা
            stmt.registerOutParameter(1, Types.INTEGER); // Employee ID (INOUT)
            stmt.registerOutParameter(2, Types.DECIMAL); // Salary (INOUT)

            stmt.execute();
            
            // INOUT parameter থেকে মান রিট্রাইভ করা
            int empId = stmt.getInt(1); // Get the updated employee ID
            double updatedSalary = stmt.getDouble(2); // Get the updated salary

            System.out.println("Employee ID: " + empId);
            System.out.println("Updated Salary: " + updatedSalary);

            stmt.close();
            conn.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

এখানে, INOUT parameter হিসেবে emp_id এবং salary দুটি প্যারামিটার ব্যবহৃত হচ্ছে। এই প্যারামিটারগুলির মান ইনপুট হিসেবে পাঠানো হচ্ছে এবং প্রোসিজারের মাধ্যমে আউটপুট হিসেবে পরিবর্তিত মান ফিরে আসছে।


Conclusion

IN, OUT, এবং INOUT parameters JDBC-তে ডেটাবেসের সাথে যোগাযোগ করার সময় খুবই গুরুত্বপূর্ণ ভূমিকা পালন করে। IN parameters ব্যবহার করে আপনি ইনপুট ডেটা পাঠাতে পারেন, OUT parameters ব্যবহার করে আপনি ডেটাবেস থেকে আউটপুট ডেটা ফেরত পেতে পারেন এবং INOUT parameters ব্যবহার করে আপনি ডেটা প্রক্রিয়া করার পর আউটপুট হিসেবে ফেরত পেতে পারেন। JDBC তে CallableStatement ব্যবহার করে এগুলি কার্যকরভাবে ব্যবহৃত হয়।

Content added By

উদাহরণ সহ CallableStatement এবং Stored Procedures

249

JDBC (Java Database Connectivity) ব্যবহার করে আপনি SQL কুয়েরি চালানোর পাশাপাশি Stored Procedures কল করতে পারেন। CallableStatement হল একটি জেডিবিসি অবজেক্ট যা SQL Stored Procedure বা ফাংশন কল করতে ব্যবহৃত হয়। এটি PreparedStatement এর মতোই কাজ করে, তবে এটি Stored Procedures এবং SQL Functions-এ কাজ করার জন্য বিশেষভাবে ডিজাইন করা হয়েছে।

Stored Procedures হল ডেটাবেসে সংরক্ষিত প্রোগ্রাম যা SQL স্টেটমেন্ট, লজিক এবং অন্যান্য কার্যক্রম একত্রিত করে। এগুলি ডেটাবেস সার্ভারের মধ্যে থাকে এবং পুনরায় ব্যবহারযোগ্য হয়।

এই অধ্যায়ে, CallableStatement এবং Stored Procedures ব্যবহার করার প্রক্রিয়া এবং উদাহরণ দেওয়া হবে।


CallableStatement এর কাজ

CallableStatement হল JDBC API-তে একটি ইন্টারফেস যা ডেটাবেসের Stored Procedures বা ফাংশন কল করতে ব্যবহৃত হয়। এটি PreparedStatement এর মতোই কাজ করে তবে এটিতে সঞ্চিত (stored) প্রক্রিয়া বা ফাংশন চালানো সম্ভব।

CallableStatement তৈরি এবং Stored Procedure কল করা

Step 1: Stored Procedure তৈরি করা

প্রথমে, ডেটাবেসে একটি Stored Procedure তৈরি করতে হবে। ধরুন, আমাদের একটি users টেবিল আছে এবং আমরা একটি Stored Procedure তৈরি করব যা ইউজারের id দ্বারা ইউজারের নাম রিটার্ন করবে।

MySQL এ Stored Procedure উদাহরণ:

DELIMITER CREATEPROCEDUREGetUserById(INuserIdINT)BEGINSELECTnameFROMusersWHEREid=userId;END

CREATE PROCEDURE GetUserById(IN userId INT)
BEGIN
    SELECT name FROM users WHERE id = userId;
END 

DELIMITER ;

এখানে, GetUserById একটি Stored Procedure যা userId ইনপুট নেবে এবং সেই id এর সাথে মিলিত ইউজারের নাম রিটার্ন করবে।


Step 2: Java Code-এ CallableStatement ব্যবহার

এখন আমরা Java দিয়ে এই Stored Procedure কল করব।

উদাহরণ: CallableStatement দিয়ে Stored Procedure কল করা

import java.sql.*;

public class CallableStatementExample {

    public static void main(String[] args) {
        // ডেটাবেসের সংযোগ তথ্য
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection established!");

            // CallableStatement তৈরি করা
            String sql = "{call GetUserById(?)}";
            CallableStatement stmt = conn.prepareCall(sql);

            // ইনপুট প্যারামিটার সেট করা (যেমন userId)
            stmt.setInt(1, 1); // 1 হল userId, এখানে আমরা id=1 এর নাম চাই

            // Stored Procedure এর রেজাল্ট প্রাপ্তি
            ResultSet rs = stmt.executeQuery();

            // রেজাল্ট প্রিন্ট করা
            if (rs.next()) {
                String name = rs.getString("name");
                System.out.println("User Name: " + name);
            }

            // রিসোর্স বন্ধ করা
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

কোড ব্যাখ্যা:

  1. Connection: DriverManager.getConnection() মেথড দিয়ে ডেটাবেসে সংযোগ তৈরি করা হয়েছে।
  2. CallableStatement: {call GetUserById(?)} এর মাধ্যমে GetUserById নামক Stored Procedure কল করা হয়েছে। এখানে ? হল ইনপুট প্যারামিটার যা userId হিসেবে ব্যবহৃত হবে।
  3. setInt(): stmt.setInt(1, 1) মেথডের মাধ্যমে userId প্যারামিটার 1 হিসেবে সেট করা হয়েছে।
  4. executeQuery(): executeQuery() মেথড দিয়ে SQL কুয়েরি চালানো হয়েছে যা রেজাল্ট সেট ফেরত দিবে।
  5. ResultSet: rs.getString("name") ব্যবহার করে ফলাফল থেকে ইউজারের নাম রিট্রাইভ করা হয়েছে।

CallableStatement দিয়ে আউটপুট প্যারামিটার ব্যবহার

বেশ কিছু Stored Procedure আউটপুট প্যারামিটার ব্যবহার করে, যেখানে আউটপুট ডেটা ডেটাবেসে সেট করা হয় এবং Java অ্যাপ্লিকেশন সেই আউটপুট গ্রহণ করে। এটির জন্য registerOutParameter() মেথড ব্যবহার করা হয়।

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

import java.sql.*;

public class CallableStatementOutParamExample {

    public static void main(String[] args) {
        // ডেটাবেসের সংযোগ তথ্য
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, username, password)) {
            System.out.println("Connection established!");

            // CallableStatement তৈরি করা
            String sql = "{call GetUserNameById(?, ?)}"; // দুটি প্যারামিটার: id এবং আউটপুট নাম
            CallableStatement stmt = conn.prepareCall(sql);

            // ইনপুট প্যারামিটার সেট করা
            stmt.setInt(1, 1);  // userId = 1

            // আউটপুট প্যারামিটার রেজিস্টার করা
            stmt.registerOutParameter(2, Types.VARCHAR);  // আউটপুট টাইপ হল VARCHAR

            // Stored Procedure এক্সিকিউট করা
            stmt.execute();

            // আউটপুট প্যারামিটার রিটার্ন করা
            String userName = stmt.getString(2);
            System.out.println("User Name: " + userName);

            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

কোড ব্যাখ্যা:

  1. registerOutParameter(): এটি আউটপুট প্যারামিটার রেজিস্টার করতে ব্যবহৃত হয়, এখানে Types.VARCHAR ব্যবহার করা হয়েছে কারণ ইউজারের নাম একটি স্ট্রিং (VARCHAR) টাইপ।
  2. getString(): আউটপুট প্যারামিটার রিটার্ন করার জন্য stmt.getString(2) ব্যবহার করা হয়েছে, যা userName আউটপুট প্যারামিটার থেকে ডেটা রিটার্ন করবে।

Conclusion

CallableStatement JDBC API-তে একটি গুরুত্বপূর্ণ অংশ, যা Stored Procedures এবং SQL Functions চালাতে সহায়তা করে। Stored Procedures ডেটাবেসে সংরক্ষিত SQL কোড যা পুনরায় ব্যবহৃত হতে পারে এবং এটি অধিক কার্যকরী ও নিরাপদ ডেটাবেস অপারেশন পরিচালনা করতে সহায়তা করে।

CallableStatement ব্যবহার করে ইনপুট এবং আউটপুট প্যারামিটার সহ Stored Procedure কল করা যায়, যা Java অ্যাপ্লিকেশনগুলোকে ডেটাবেসের কার্যক্রম আরও দক্ষভাবে পরিচালনা করতে সক্ষম করে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...