Derby Stored Procedures এবং Triggers

Database Tutorials - অ্যাপাচি ডার্বি (Apache Derby)
229
229

Apache Derby একটি শক্তিশালী ডেটাবেস সিস্টেম যা Stored Procedures এবং Triggers সমর্থন করে, যা ডেটাবেস লজিক এবং স্বয়ংক্রিয় কার্যক্রম পরিচালনা করতে সহায়তা করে। এগুলি ডেটাবেসের মধ্যে অ্যাপ্লিকেশন লজিক সংরক্ষণ করতে এবং বিভিন্ন ডেটাবেস ইভেন্টের জন্য প্রক্রিয়া তৈরি করতে ব্যবহৃত হয়।


Stored Procedures in Apache Derby

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

Stored Procedure তৈরি করা:

Derby-তে Stored Procedure তৈরি করার জন্য CREATE PROCEDURE স্টেটমেন্ট ব্যবহার করতে হয়। উদাহরণস্বরূপ, যদি আপনি একটি employee টেবিলের একটি কর্মচারীর তথ্য আপডেট করতে চান, তবে একটি স্টোরড প্রসিডিউর তৈরি করতে পারেন:

CREATE PROCEDURE updateEmployeeSalary(
    IN employee_id INT,
    IN new_salary DECIMAL
)
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'org.apache.derby.storeProcedure.updateSalary'

Stored Procedure কল করা:

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

CALL updateEmployeeSalary(101, 50000.00);

এটি employee_id 101 এর জন্য salary আপডেট করবে।

Stored Procedures এর সুবিধা:

  1. Performance: একটি স্টোরড প্রসিডিউর একাধিক SQL কুয়েরি একত্রে চালাতে পারে, যা এককভাবে কুয়েরি চালানোর চেয়ে দ্রুত হতে পারে।
  2. Code Reusability: একবার স্টোরড প্রসিডিউর তৈরি হলে, বারবার ব্যবহৃত হতে পারে, যা কোড পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
  3. Security: স্টোরড প্রসিডিউর ব্যবহার করার মাধ্যমে ইউজারদের সরাসরি টেবিল অ্যাক্সেস সীমিত করা যায়, এবং শুধুমাত্র প্রক্রিয়াটি ব্যবহৃত হয়।

Triggers in Apache Derby

Trigger হল একটি ডেটাবেস অবজেক্ট যা নির্দিষ্ট ডেটাবেস ইভেন্টের সময় স্বয়ংক্রিয়ভাবে চালিত হয়। ডেটাবেসে ডেটা ইনসার্ট, আপডেট বা ডিলিট হওয়ার পরে বা আগে ট্রিগার কল হতে পারে। একটি ট্রিগার সাধারণত ডেটাবেস অপারেশনগুলির সাথে যুক্ত লজিক সম্পাদন করতে ব্যবহৃত হয়।

Trigger তৈরি করা:

Derby-তে ট্রিগার তৈরি করতে CREATE TRIGGER স্টেটমেন্ট ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি আপনি চান যে, যখন কোনো নতুন কর্মচারী employee টেবিলে যোগ হবে, তখন তাদের সাথে একটি স্বয়ংক্রিয়ভাবে salary_history টেবিলেও একটি এন্ট্রি করা হোক, তাহলে আপনি এমন একটি ট্রিগার তৈরি করতে পারেন:

CREATE TRIGGER afterEmployeeInsert
AFTER INSERT ON employee
FOR EACH ROW
INSERT INTO salary_history (employee_id, salary, date)
VALUES (NEW.id, NEW.salary, CURRENT_DATE);

এটি employee টেবিলে নতুন একটি রেকর্ড ইনসার্ট হওয়ার পর salary_history টেবিলেও একটি রেকর্ড যোগ করবে।

Trigger Types:

  1. BEFORE Trigger: এটি যখন কোনো ডেটাবেস অপারেশন সম্পাদিত হওয়ার আগে কার্যকর হয়।
  2. AFTER Trigger: এটি ডেটাবেস অপারেশন সম্পাদিত হওয়ার পর কার্যকর হয়।

Trigger কল করা:

ট্রিগারগুলি স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডেটাবেস ইভেন্টে (যেমন INSERT, UPDATE, বা DELETE) কল হয়, তাই আপনার ম্যানুয়ালি ট্রিগার কল করার প্রয়োজন নেই। এটি INSERT বা অন্য কোনো SQL অপারেশন সম্পাদিত হওয়ার পর স্বয়ংক্রিয়ভাবে কার্যকর হয়।

Triggers এর সুবিধা:

  1. Data Integrity: ট্রিগার ব্যবহার করে ডেটাবেসে ডেটার ইন্টেগ্রিটি নিশ্চিত করা যায়। উদাহরণস্বরূপ, যখন কোনো ডেটা ইনসার্ট বা আপডেট হয়, তখন অতিরিক্ত যাচাই করা যায়।
  2. Automation: ট্রিগারগুলি ডেটাবেসে পরিবর্তন হলে স্বয়ংক্রিয়ভাবে কাজ করে, যা কিছু টাস্ক যেমন লোগিং, হিসাবনিকাশ বা ডেটা সিঙ্ক্রোনাইজেশনকে স্বয়ংক্রিয় করে তোলে।
  3. Consistency: ট্রিগার ব্যবহার করে, ডেটাবেসে তথ্য আপডেট বা সংশোধন করার সময় ডেটার মধ্যে সামঞ্জস্য বজায় রাখা যায়।

Stored Procedures এবং Triggers এর মধ্যে পার্থক্য:

বৈশিষ্ট্যStored ProcedureTrigger
ব্যবহারএক বা একাধিক SQL অপারেশন চালানোর জন্যডেটাবেস ইভেন্ট (INSERT/UPDATE/DELETE) এ কার্যকর
কোড লেখার স্থানডেটাবেস থেকে কল করা হয়স্বয়ংক্রিয়ভাবে ডেটাবেস ইভেন্টে ট্রিগার হয়
অপারেশন সময়ম্যানুয়ালি কল করতে হয়নির্দিষ্ট ডেটাবেস ইভেন্টে চালিত হয়
রিটার্ন ভ্যালুরিটার্ন ভ্যালু থাকতে পারেকোনো রিটার্ন ভ্যালু নেই
নির্দিষ্ট কার্যক্রমনির্দিষ্ট কার্যক্রম সম্পাদন করানির্দিষ্ট ডেটাবেস ইভেন্টে কার্যক্রম সম্পাদন
উদাহরণনতুন কর্মচারীর বেতন আপডেট করানতুন কর্মচারী যোগ হলে লোগিং করা

উপসংহার

Stored Procedures এবং Triggers দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটাবেস লজিক এবং কার্যক্রমকে স্বয়ংক্রিয় এবং কার্যকরী করে তোলে। Stored Procedures একাধিক SQL অপারেশন একত্রে চালানোর জন্য ব্যবহৃত হয়, যেখানে Triggers নির্দিষ্ট ডেটাবেস ইভেন্টে স্বয়ংক্রিয়ভাবে কার্যকর হয়। এই দুটি ফিচার ডেটাবেসের কার্যকারিতা, নিরাপত্তা, এবং স্বয়ংক্রিয়তা বৃদ্ধিতে সহায়ক।

common.content_added_by

Stored Procedures তৈরি এবং ব্যবহারের উদাহরণ

231
231

Stored Procedures হল SQL কোডের একটি সেট, যা ডেটাবেসে সংরক্ষিত থাকে এবং ডেটাবেসের মাধ্যমে কল করা যায়। এটি সাধারণত কোনো নির্দিষ্ট কাজ বা কর্মসূচি সম্পাদন করার জন্য ব্যবহৃত হয়, যেমন ডেটা ইনসার্ট, আপডেট, অথবা আরও জটিল লগিকাল অপারেশন।

Apache Derby-এ stored procedure তৈরি এবং ব্যবহার করা সম্ভব, যদিও এটি অন্যান্য ডেটাবেসের তুলনায় কিছুটা সীমিত। তবে আপনি SQL ব্লক এবং Java প্রোগ্রামিং ভাষা ব্যবহার করে stored procedures তৈরি করতে পারেন।


Stored Procedure তৈরি করা

Apache Derby-এ Stored Procedure তৈরি করতে Java ব্যবহার করতে হয়, কারণ Derby SQL-এ শুধুমাত্র Java-based stored procedures সমর্থন করে। Java-based stored procedure একটি Java ক্লাস বা মেথড যা SQL কোয়েরি চালানোর মাধ্যমে ডেটাবেসে কার্যকর হয়।

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

ধরা যাক, আপনি একটি Stored Procedure তৈরি করতে চান যা একটি employee টেবিলের মধ্যে id এর ভিত্তিতে age আপডেট করবে।

  1. Java ক্লাস তৈরি করা:

প্রথমে একটি Java ক্লাস তৈরি করুন যা stored procedure হিসেবে কাজ করবে। উদাহরণস্বরূপ, নিচের Java কোডে একটি মেথড তৈরি করা হয়েছে যা employee টেবিলের age আপডেট করবে।

import java.sql.*;

public class UpdateEmployeeAge {
    public static void updateAge(Connection conn, int employeeId, int newAge) throws SQLException {
        String sql = "UPDATE employee SET age = ? WHERE id = ?";
        
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, newAge);
            stmt.setInt(2, employeeId);
            stmt.executeUpdate();
        }
    }
}
  1. Stored Procedure তৈরি করা:

এখন, আপনি Derby ডেটাবেসে UpdateEmployeeAge ক্লাসের stored procedure তৈরি করতে পারেন। এটা করার জন্য আপনি java.sql.Connection এবং CallableStatement ব্যবহার করবেন।

-- Stored procedure তৈরি করা
CREATE PROCEDURE updateEmployeeAge(IN employeeId INT, IN newAge INT)
    LANGUAGE JAVA
    PARAMETER STYLE JAVA
    DYNAMIC RESULT SETS 0
    EXTERNAL NAME 'UpdateEmployeeAge.updateAge';

এটি updateEmployeeAge নামে একটি stored procedure তৈরি করবে, যা employeeId এবং newAge ইনপুট নেয় এবং employee টেবিলের age আপডেট করে।


Stored Procedure কল করা

Stored Procedure কল করতে CALL কমান্ড ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে আমরা updateEmployeeAge স্টোরড প্রসিডিউর কল করছি:

-- Stored Procedure কল করা
CALL updateEmployeeAge(1, 35);

এই কমান্ডটি employee টেবিলের id = 1 এর age কলাম 35-এ আপডেট করবে।


Stored Procedure Java কোড দিয়ে কল করা

এখন, আপনি JDBC ব্যবহার করে Java থেকে stored procedure কল করতে পারেন।

import java.sql.*;

public class CallStoredProcedure {
    public static void main(String[] args) {
        String url = "jdbc:derby:myDB;create=true"; // ডেটাবেসের URL
        try (Connection conn = DriverManager.getConnection(url)) {
            // CallableStatement তৈরি করা
            String sql = "{call updateEmployeeAge(?, ?)}";
            try (CallableStatement stmt = conn.prepareCall(sql)) {
                // ইনপুট প্যারামিটার সেট করা
                stmt.setInt(1, 1);  // employeeId
                stmt.setInt(2, 35); // newAge

                // Stored Procedure কল করা
                stmt.executeUpdate();
                System.out.println("Employee age updated successfully.");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

এই Java কোডটি JDBC ব্যবহার করে stored procedure কল করবে, এবং employeeId = 1 এর age 35-এ আপডেট করবে।


Stored Procedure থেকে আউটপুট ফেরত দেওয়া

আপনি stored procedure-এর মাধ্যমে আউটপুটও ফেরত দিতে পারেন। যেমন, কোনো নির্দিষ্ট id এর জন্য age ফিরিয়ে দেওয়ার জন্য আপনি নিচের মতো একটি stored procedure তৈরি করতে পারেন:

  1. Java কোড:
public class GetEmployeeAge {
    public static int getAge(Connection conn, int employeeId) throws SQLException {
        String sql = "SELECT age FROM employee WHERE id = ?";
        
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, employeeId);
            ResultSet rs = stmt.executeQuery();
            
            if (rs.next()) {
                return rs.getInt("age");
            } else {
                return -1;  // If no employee found
            }
        }
    }
}
  1. Stored Procedure তৈরি করা:
CREATE PROCEDURE getEmployeeAge(IN employeeId INT, OUT employeeAge INT)
    LANGUAGE JAVA
    PARAMETER STYLE JAVA
    DYNAMIC RESULT SETS 0
    EXTERNAL NAME 'GetEmployeeAge.getAge';
  1. Stored Procedure কল করা:
-- Stored Procedure কল করা এবং আউটপুট নেয়া
CALL getEmployeeAge(1, ?);

সারাংশ

  • Stored Procedures ডেটাবেসে একাধিক SQL অপারেশন একত্রে সম্পাদন করার জন্য ব্যবহৃত হয়।
  • Apache Derby Java-based stored procedures সমর্থন করে, যেখানে আপনি Java ক্লাসে কোড লিখে stored procedure তৈরি করতে পারেন।
  • CALL কমান্ড ব্যবহার করে stored procedure কল করা হয়।
  • Java JDBC ব্যবহার করে stored procedure কল করা যেতে পারে এবং আউটপুট ফেরত নেওয়া সম্ভব।
common.content_added_by

Triggers তৈরি এবং ব্যবহার

207
207

Triggers হল ডেটাবেসের অবজারভেবল অবস্থা বা ডেটাবেসের মধ্যে কিছু নির্দিষ্ট পরিবর্তন ঘটলেই স্বয়ংক্রিয়ভাবে কার্যকর হওয়া প্রোগ্রাম। উদাহরণস্বরূপ, আপনি একটি ট্রিগার সেট করতে পারেন যা ডেটাবেসে একটি নতুন রেকর্ড ইনসার্ট হলে বা কোনো রেকর্ড আপডেট হলে কিছু নির্দিষ্ট কাজ সম্পাদন করবে।

Apache Derby ডেটাবেসে Triggers তৈরি ও ব্যবহার করার জন্য SQL কুয়েরি ব্যবহৃত হয়, যেখানে BEFORE বা AFTER কিওয়ার্ড দ্বারা ট্রিগারের টাইপ নির্ধারণ করা হয়।


Trigger এর প্রধান টাইপ

  1. BEFORE Trigger: একটি নির্দিষ্ট অপারেশন (যেমন INSERT, UPDATE, বা DELETE) হওয়ার আগেই ট্রিগারটি কার্যকর হয়। এই ধরনের ট্রিগার ডেটা পরিবর্তনের আগে কিছু যাচাই বা পরিবর্তন করতে ব্যবহৃত হয়।
  2. AFTER Trigger: একটি নির্দিষ্ট অপারেশন হওয়ার পর ট্রিগারটি কার্যকর হয়। এই ধরনের ট্রিগার ডেটা পরিবর্তনের পরে কিছু অতিরিক্ত অপারেশন বা অডিটিং কাজ করতে ব্যবহৃত হয়।

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

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

CREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
[FOR EACH ROW]
[WHEN condition]
BEGIN
    -- Trigger action (SQL statements)
END;
  • trigger_name: ট্রিগারের নাম।
  • trigger_time: BEFORE বা AFTER – ট্রিগারটি কোন সময় কার্যকর হবে।
  • trigger_event: INSERT, UPDATE, বা DELETE – ট্রিগারটি কোন অপারেশন ঘটলে কার্যকর হবে।
  • table_name: টেবিলের নাম যেখানে ট্রিগারটি প্রযোজ্য হবে।
  • condition: (ঐচ্ছিক) – ট্রিগারটি একটি নির্দিষ্ট শর্তে চালানোর জন্য।
  • trigger action: ট্রিগারের কাজ যা SQL স্টেটমেন্ট দ্বারা নির্ধারিত হয়।

Example 1: BEFORE Trigger

ধরা যাক, আমাদের একটি টেবিল রয়েছে যেটি employees নামে পরিচিত। আমরা একটি BEFORE INSERT Trigger তৈরি করতে চাই, যাতে ইনসার্ট করার আগে কোনো salary কলামের মান চেক করা হয় এবং তা ০ এর কম না হয়।

CREATE TRIGGER check_salary_before_insert
BEFORE INSERT
ON employees
FOR EACH ROW
WHEN (NEW.salary < 0)
BEGIN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Salary cannot be negative';
END;

এই ট্রিগারটি তখনই কাজ করবে যখন নতুন রেকর্ড ইনসার্ট করার আগে salary এর মান নেতিবাচক (negative) হবে, এবং তখন একটি ত্রুটি বার্তা প্রদর্শিত হবে।


Example 2: AFTER Trigger

ধরা যাক, একটি sales টেবিল রয়েছে, এবং আমরা একটি AFTER INSERT Trigger তৈরি করতে চাই যাতে, যখনই নতুন কোনো বিক্রয়ের তথ্য ইনসার্ট করা হয়, তখন সেলস রিপোর্ট টেবিল আপডেট হয়।

CREATE TRIGGER update_sales_report_after_insert
AFTER INSERT
ON sales
FOR EACH ROW
BEGIN
    UPDATE sales_report
    SET total_sales = total_sales + NEW.amount
    WHERE report_date = CURRENT_DATE;
END;

এই ট্রিগারটি তখনই কার্যকর হবে যখন নতুন বিক্রয়ের রেকর্ড ইনসার্ট করা হবে এবং এটি sales_report টেবিলের total_sales কলাম আপডেট করবে, যেখানে রিপোর্টের তারিখটি বর্তমান তারিখের সমান হবে।


Example 3: AFTER UPDATE Trigger

ধরা যাক, একটি students টেবিল রয়েছে, এবং আমরা একটি AFTER UPDATE Trigger তৈরি করতে চাই, যাতে student_score কলামের মান আপডেট করার পর একটি লগ টেবিল এ পরিবর্তনটি রেকর্ড করা হয়।

CREATE TRIGGER log_score_update_after_update
AFTER UPDATE
ON students
FOR EACH ROW
WHEN (NEW.score <> OLD.score)
BEGIN
    INSERT INTO score_log (student_id, old_score, new_score, update_time)
    VALUES (NEW.id, OLD.score, NEW.score, CURRENT_TIMESTAMP);
END;

এই ট্রিগারটি তখনই কার্যকর হবে যখন কোনো ছাত্রের স্কোর আপডেট হবে এবং এটি সেই পরিবর্তনটি score_log টেবিলে লগ করবে।


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

  1. Trigger Nesting: Derby তে ট্রিগারগুলোর মধ্যে nested triggers (একটি ট্রিগার অন্য ট্রিগারকে কল করা) সমর্থিত নয়।
  2. Complex Operations: Derby তে ট্রিগারগুলোর মধ্যে খুব জটিল অপারেশন বা লুপিং সমর্থন করা কঠিন হতে পারে। সাধারণত, ট্রিগারগুলোর জন্য সহজ অপারেশন ব্যবহার করার পরামর্শ দেওয়া হয়।
  3. Concurrency Control: যদিও ট্রিগারগুলি অনেক সময় কার্যকরী হয়, তবে একাধিক ট্রানজেকশন যদি একসাথে একই ডেটাবেসে কাজ করে, তবে লকিং সমস্যাগুলি সৃষ্টি হতে পারে।

উপসংহার

Apache Derby তে ট্রিগার তৈরি করা একটি শক্তিশালী ফিচার যা ডেটাবেসের কার্যক্রমকে স্বয়ংক্রিয়ভাবে পরিচালনা করতে সাহায্য করে। এটি বিভিন্ন ডেটাবেস অপারেশন যেমন INSERT, UPDATE, এবং DELETE এর সাথে সংযুক্ত করা যেতে পারে। ট্রিগার ব্যবহার করে আপনি ডেটাবেসের অবস্থা সঠিকভাবে ম্যানেজ করতে এবং ডেটাবেসে কোনো পরিবর্তন ঘটলে তা কার্যকরভাবে ট্র্যাক করতে পারেন।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion