Database Tutorials SQLite এর Stored Procedures এবং Functions গাইড ও নোট

378

SQLite একটি হালকা ও সার্ভারলেস ডাটাবেস সিস্টেম হলেও, এটি কিছু পদ্ধতি এবং ফাংশন সাপোর্ট করে যা ডাটাবেসের উপর নির্ভরশীল কার্যাবলী সম্পাদন করতে ব্যবহৃত হয়। তবে, SQLite-এ Stored Procedures (সংরক্ষিত পদ্ধতি) তেমন সাপোর্ট নেই, যা অন্যান্য রিলেশনাল ডাটাবেস সিস্টেমে (যেমন MySQL বা PostgreSQL) পাওয়া যায়। SQLite মূলত প্রসেসিং লজিক বা স্টোরড প্রোসিডিওর ব্যবহারের জন্য ডিজাইন করা হয়নি। তবুও, SQLite তে ফাংশন ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট কাজ করতে পারেন।

Stored Procedures (সংরক্ষিত পদ্ধতি) এর অভাব

SQLite-এ সরাসরি Stored Procedures সাপোর্ট করা হয় না। এতে ডাটাবেস সার্ভারের বাইরে ফাংশনালিটি বা পদ্ধতি সংরক্ষণ করা সম্ভব নয়। অন্যান্য ডাটাবেসে যেমন, MySQL বা PostgreSQL-এ Stored Procedures ডাটাবেসের মধ্যে কোড সংরক্ষণ করে, সেখানে আপনি বিভিন্ন SQL অপারেশন এবং লজিক একত্রিত করতে পারেন। তবে, SQLite শুধুমাত্র SQL কুয়েরি-ই সাপোর্ট করে এবং SQL কোড বাইরে রাখতে হয়, যা কোনো স্টোরড পদ্ধতির কাজ করার মতো নয়।

তবে SQLite-এ কিছু ব্যবহারকারী সংজ্ঞায়িত ফাংশন তৈরি করা সম্ভব, কিন্তু সেগুলো Stored Procedures নয়, বরং সেগুলি User-Defined Functions (UDFs) হিসেবে কাজ করে।

User-Defined Functions (UDFs)

SQLite-এ আপনি User-Defined Functions (UDFs) ব্যবহার করতে পারেন। এগুলি কাস্টম ফাংশন যা SQLite ডাটাবেসে SQL কুয়েরি দ্বারা ব্যবহার করা যায়। যদিও SQLite নিজে ফাংশন তৈরি করার সুযোগ দেয় না, আপনি C বা অন্য কোনো প্রোগ্রামিং ভাষায় ফাংশন তৈরি করতে পারেন এবং SQLite-এ এই ফাংশনগুলো ব্যবহার করতে পারেন।


User-Defined Functions (UDFs) তৈরি করা

SQLite-এ UDF তৈরি করার জন্য আপনাকে সাধারণত C প্রোগ্রামিং ভাষা ব্যবহার করতে হয়। UDF তৈরি করার মাধ্যমে আপনি SQLite এর কুয়েরিতে নতুন লজিক যুক্ত করতে পারেন। নিচে একটি UDF তৈরি করার প্রক্রিয়া দেওয়া হলো:

উদাহরণ: C ভাষায় UDF তৈরি

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

    #include <sqlite3.h>
    
    static int double_value(sqlite3_context *context, int argc, sqlite3_value **argv) {
        if (argc == 1) {
            double value = sqlite3_value_double(argv[0]);
            sqlite3_result_double(context, value * 2);
        }
        return SQLITE_OK;
    }
    
  2. SQLite-এ ফাংশন নিবন্ধন করা: C কোডে তৈরি করা ফাংশনটি SQLite-এ ব্যবহার করার জন্য এটি নিবন্ধন করতে হবে। উদাহরণস্বরূপ:

    int main() {
        sqlite3 *db;
        sqlite3_open(":memory:", &db);
    
        // UDF নিবন্ধন
        sqlite3_create_function(db, "double_value", 1, SQLITE_UTF8, NULL, double_value, NULL, NULL);
    
        // কুয়েরি রান করা
        sqlite3_exec(db, "SELECT double_value(10);", NULL, NULL, NULL);
    
        sqlite3_close(db);
        return 0;
    }
    
  3. ফাংশন ব্যবহার করা: একবার ফাংশনটি নিবন্ধিত হলে, আপনি SQLite কুয়েরিতে এটি ব্যবহার করতে পারেন:

    SELECT double_value(10);
    

    এই কুয়েরিটি 20 রিটার্ন করবে, যেহেতু এটি ১০ সংখ্যাকে ডাবল করবে।


SQLite-এর Built-in Functions

SQLite এর মধ্যে কিছু বিল্ট-ইন ফাংশন রয়েছে, যা SQL কুয়েরির মধ্যে বিভিন্ন কাজ সম্পাদন করতে ব্যবহৃত হয়। কিছু সাধারণ বিল্ট-ইন ফাংশন নিচে দেওয়া হলো:

  1. ABS(x): একটি সংখ্যার পরিমাপযোগ্য মান (অর্থাৎ, পজিটিভ ভ্যালু) রিটার্ন করে।

    SELECT ABS(-5);  -- রিটার্ন হবে 5
    
  2. LENGTH(x): একটি স্ট্রিংয়ের দৈর্ঘ্য রিটার্ন করে।

    SELECT LENGTH('SQLite');  -- রিটার্ন হবে 6
    
  3. UPPER(x): একটি স্ট্রিংকে বড় হাতের অক্ষরে রূপান্তর করে।

    SELECT UPPER('sqlite');  -- রিটার্ন হবে 'SQLITE'
    
  4. LOWER(x): একটি স্ট্রিংকে ছোট হাতের অক্ষরে রূপান্তর করে।

    SELECT LOWER('SQLite');  -- রিটার্ন হবে 'sqlite'
    
  5. ROUND(x, d): একটি ভগ্নাংশ সংখ্যা নির্দিষ্ট দশমিক স্থান পর্যন্ত রাউন্ড করে।

    SELECT ROUND(3.14159, 2);  -- রিটার্ন হবে 3.14
    

সারাংশ

SQLite এ Stored Procedures সরাসরি সাপোর্ট করা হয় না, কিন্তু আপনি User-Defined Functions (UDFs) তৈরি করে SQLite কুয়েরি বা ডাটাবেসে কাস্টম ফাংশন যুক্ত করতে পারেন। C বা অন্যান্য ভাষায় ফাংশন লিখে SQLite-এ UDF হিসেবে ব্যবহার করা যেতে পারে। SQLite কিছু বিল্ট-ইন ফাংশনও সাপোর্ট করে যেমন ABS, LENGTH, UPPER, LOWER, এবং ROUND যা আপনাকে SQL কুয়েরিতে প্রক্রিয়াকরণে সহায়তা করে।

Content added By

SQLite এর Built-in Functions (Date, String, Math Functions)

346

SQLite বেশ কিছু built-in functions প্রদান করে, যা বিভিন্ন ধরনের ডেটা অপারেশন সহজে সম্পাদন করতে সাহায্য করে। এই functions তিনটি প্রধান ক্যাটেগরিতে ভাগ করা যেতে পারে:

  1. Date Functions: ডেটা এবং সময়ের সাথে সম্পর্কিত অপারেশন।
  2. String Functions: স্ট্রিং (text) সম্পর্কিত অপারেশন।
  3. Math Functions: গণনা বা অঙ্কের সাথে সম্পর্কিত অপারেশন।

এখানে আমরা এই তিনটি ক্যাটেগরির বিভিন্ন built-in functions আলোচনা করব।


১. Date Functions

SQLite-এ Date এবং Time সম্পর্কিত কিছু built-in function রয়েছে যা ডেটাবেসে তারিখ এবং সময়ের মান ব্যবহার করে বিভিন্ন ধরনের অপারেশন করতে সাহায্য করে।

১.১ DATE()

  • এই ফাংশনটি একটি তারিখের মান রিটার্ন করে, যা YYYY-MM-DD ফরম্যাটে থাকে।
  • ব্যবহার:

    SELECT DATE('now');
    

    এটি বর্তমান তারিখ রিটার্ন করবে।

১.২ TIME()

  • এই ফাংশনটি সময় রিটার্ন করে, HH:MM:SS ফরম্যাটে।
  • ব্যবহার:

    SELECT TIME('now');
    

    এটি বর্তমান সময় রিটার্ন করবে।

১.৩ DATETIME()

  • এটি তারিখ এবং সময়ের সংমিশ্রণ রিটার্ন করে, YYYY-MM-DD HH:MM:SS ফরম্যাটে।
  • ব্যবহার:

    SELECT DATETIME('now');
    

    এটি বর্তমান তারিখ এবং সময় রিটার্ন করবে।

১.৪ STRFTIME()

  • এটি একটি কাস্টম ফরম্যাটে তারিখ বা সময় রিটার্ন করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT STRFTIME('%Y-%m-%d %H:%M:%S', 'now');
    

    এটি বর্তমান তারিখ এবং সময় কাস্টম ফরম্যাটে রিটার্ন করবে।

১.৫ DATE_SUB() (SQLite-এ সমর্থিত নয়)

  • SQLite এর জন্য DATE_SUB() ফাংশনটি সাধারণত MySQL-এ ব্যবহৃত হয়। তবে SQLite-এ আপনি তারিখের উপর গণনা করতে STRFTIME() বা অন্যান্য পদ্ধতি ব্যবহার করতে পারেন।

২. String Functions

SQLite-এ বিভিন্ন string functions আছে, যা স্ট্রিংয়ের ওপর কাজ করতে সাহায্য করে, যেমন: স্ট্রিং এর দৈর্ঘ্য নির্ণয়, সাবস্ট্রিং বের করা, কনক্যাটিনেশন ইত্যাদি।

২.১ LENGTH()

  • এই ফাংশনটি একটি স্ট্রিং এর দৈর্ঘ্য রিটার্ন করে।
  • ব্যবহার:

    SELECT LENGTH('Hello, World!');
    

    এটি রিটার্ন করবে 13 (কারণ 'Hello, World!' স্ট্রিংয়ের দৈর্ঘ্য ১৩ টি ক্যারেক্টার)।

২.২ UPPER()

  • এই ফাংশনটি স্ট্রিংয়ের সমস্ত অক্ষরকে বড় হাতের (uppercase) আকারে রূপান্তরিত করে।
  • ব্যবহার:

    SELECT UPPER('hello');
    

    এটি রিটার্ন করবে HELLO

২.৩ LOWER()

  • এই ফাংশনটি স্ট্রিংয়ের সমস্ত অক্ষরকে ছোট হাতের (lowercase) আকারে রূপান্তরিত করে।
  • ব্যবহার:

    SELECT LOWER('HELLO');
    

    এটি রিটার্ন করবে hello

২.৪ SUBSTR()

  • এই ফাংশনটি একটি স্ট্রিং থেকে একটি সাবস্ট্রিং বের করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT SUBSTR('Hello, World!', 1, 5);
    

    এটি রিটার্ন করবে Hello (1 থেকে 5 পর্যন্ত অক্ষরগুলো)।

২.৫ CONCAT()

  • এই ফাংশনটি দুটি স্ট্রিং একত্রে (concatenate) যোগ করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT 'Hello' || ' ' || 'World!';
    

    এটি রিটার্ন করবে Hello World!। এখানে || কনক্যাটিনেশন অপারেটর।

২.৬ REPLACE()

  • এই ফাংশনটি স্ট্রিংয়ের মধ্যে নির্দিষ্ট একটি অংশ পরিবর্তন করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT REPLACE('Hello, World!', 'World', 'SQLite');
    

    এটি রিটার্ন করবে Hello, SQLite!


৩. Math Functions

SQLite-এ Math Functions সংখ্যা এবং গণনা সম্পর্কিত বিভিন্ন অপারেশন সম্পাদন করতে ব্যবহৃত হয়।

৩.১ ABS()

  • এই ফাংশনটি একটি সংখ্যার অ্যাবসলিউট মান রিটার্ন করে।
  • ব্যবহার:

    SELECT ABS(-10);
    

    এটি রিটার্ন করবে 10

৩.২ ROUND()

  • এই ফাংশনটি একটি সংখ্যাকে নির্দিষ্ট দশমিক স্থান পর্যন্ত রাউন্ড করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT ROUND(10.12345, 2);
    

    এটি রিটার্ন করবে 10.12 (দ্বিতীয় দশমিক স্থান পর্যন্ত রাউন্ড করা হয়েছে)।

৩.৩ RANDOM()

  • এই ফাংশনটি একটি এলোমেলো সংখ্যা রিটার্ন করে।
  • ব্যবহার:

    SELECT RANDOM();
    

    এটি একটি এলোমেলো পূর্ণসংখ্যা রিটার্ন করবে।

৩.৪ PI()

  • এই ফাংশনটি গাণিতিক কনস্ট্যান্ট π (পাই) রিটার্ন করে।
  • ব্যবহার:

    SELECT PI();
    

    এটি রিটার্ন করবে 3.14159265358979

৩.৫ POWER()

  • এই ফাংশনটি একটি সংখ্যা পাওয়ার রূপে গণনা করতে ব্যবহৃত হয়।
  • ব্যবহার:

    SELECT POWER(2, 3);
    

    এটি রিটার্ন করবে 8 (2^3)।


সারাংশ

SQLite-এ বিভিন্ন built-in functions রয়েছে যা ডেটাবেসের বিভিন্ন ধরণের অপারেশন সহজে করতে সাহায্য করে। এই functions মধ্যে Date Functions, String Functions, এবং Math Functions অন্তর্ভুক্ত। এগুলি ডেটাবেস অপারেশনকে আরো কার্যকর এবং দ্রুত করতে সহায়ক, বিশেষত যখন ডেটার উপর বিভিন্ন ধরনের প্রক্রিয়া বা গণনা করতে হয়।

Content added By

User-Defined Functions (UDF) তৈরি

363

User-Defined Functions (UDF) হল SQLite-এ এমন ফাংশন যা আপনি নিজে তৈরি করতে পারেন, সাধারণত নির্দিষ্ট কাজ বা প্রক্রিয়াগুলোকে সহজ করার জন্য। SQLite স্ট্যান্ডার্ড ফাংশন যেমন SUM(), AVG(), ইত্যাদি সরবরাহ করে, তবে যদি আপনার কোনো বিশেষ কাজ করতে হয় যেটি পূর্বনির্ধারিত ফাংশন দ্বারা করা সম্ভব নয়, তাহলে আপনি নিজস্ব ফাংশন তৈরি করতে পারেন।

SQLite-এর UDF তৈরি করা সাধারণত একটি অ্যাপ্লিকেশন বা প্রোগ্রামিং ভাষার (যেমন Python, C, অথবা C++) মাধ্যমে করা হয়। UDF-এ আপনি আপনার কাস্টম ফাংশন তৈরি করতে পারেন যেগুলো SQL কুয়েরি দিয়ে SQLite ডাটাবেসে ব্যবহার করা যাবে।


UDF তৈরি করার সাধারণ ধাপ:

  1. UDF তৈরি করার জন্য একটি প্রোগ্রামিং ভাষা ব্যবহার করা হয়:
    • সাধারণত SQLite C বা Python ভাষার মাধ্যমে UDF তৈরি করা হয়। অন্যান্য ভাষার জন্যও লাইব্রেরি সমর্থন রয়েছে।
  2. UDF নিবন্ধন করা:
    • UDF তৈরি করার পর, আপনি এই ফাংশনটিকে SQLite তে নিবন্ধন করতে পারেন যাতে আপনি SQL কুয়েরি থেকে তা ব্যবহার করতে পারেন।

C-এ SQLite UDF তৈরি করা

SQLite C API ব্যবহার করে UDF তৈরি করা যায়। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি কাস্টম ফাংশন তৈরি করা হয়েছে যা দুটি সংখ্যার যোগফল প্রদান করে।

ধাপ ১: C ফাইলে UDF কোড লিখা

#include <stdio.h>
#include <sqlite3.h>

// কাস্টম UDF ফাংশন যা দুটি সংখ্যার যোগফল প্রদান করে
static void add_numbers(sqlite3_context *context, int argc, sqlite3_value **argv) {
    if (argc != 2) {
        sqlite3_result_error(context, "Wrong number of arguments", -1);
        return;
    }

    // প্রথম আর্গুমেন্টে একটি সংখ্যা এবং দ্বিতীয় আর্গুমেন্টে আরেকটি সংখ্যা পাওয়া যাচ্ছে
    double num1 = sqlite3_value_double(argv[0]);
    double num2 = sqlite3_value_double(argv[1]);
    
    // যোগফল ক্যালকুলেট করে ফলাফল প্রদান করা
    sqlite3_result_double(context, num1 + num2);
}

int main() {
    sqlite3 *db;
    sqlite3_open(":memory:", &db);

    // UDF নিবন্ধন
    sqlite3_create_function(db, "add_numbers", 2, SQLITE_UTF8, NULL, add_numbers, NULL, NULL);

    // কুয়েরি চালানো যেখানে কাস্টম ফাংশন ব্যবহার করা হয়েছে
    sqlite3_exec(db, "CREATE TABLE test (a REAL, b REAL);", 0, 0, 0);
    sqlite3_exec(db, "INSERT INTO test (a, b) VALUES (3.5, 4.5);", 0, 0, 0);
    sqlite3_exec(db, "SELECT a, b, add_numbers(a, b) FROM test;", 0, 0, 0);

    sqlite3_close(db);
    return 0;
}

ধাপ ২: কাস্টম UDF নিবন্ধন

এখানে sqlite3_create_function ব্যবহার করা হয়েছে যা SQLite এ কাস্টম UDF নিবন্ধন করে। এই ফাংশনটি add_numbers নামে একটি UDF নিবন্ধন করেছে যেটি দুইটি আর্গুমেন্ট নিয়ে তাদের যোগফল প্রদান করবে।


Python-এ SQLite UDF তৈরি করা

Python ব্যবহার করে SQLite-এর UDF তৈরি করতে sqlite3 লাইব্রেরি ব্যবহার করা হয়।

ধাপ ১: Python কোড লিখা

import sqlite3

# কাস্টম UDF ফাংশন যা দুটি সংখ্যার যোগফল প্রদান করে
def add_numbers(num1, num2):
    return num1 + num2

# SQLite ডাটাবেসে সংযোগ
conn = sqlite3.connect(":memory:")
conn.create_function("add_numbers", 2, add_numbers)

# টেবিল তৈরি করা এবং কাস্টম ফাংশন ব্যবহার করা
conn.execute("CREATE TABLE test (a REAL, b REAL);")
conn.execute("INSERT INTO test (a, b) VALUES (3.5, 4.5);")

# কুয়েরি চালানো যেখানে কাস্টম ফাংশন ব্যবহার করা হয়েছে
cursor = conn.execute("SELECT a, b, add_numbers(a, b) FROM test;")
for row in cursor:
    print(row)

conn.close()

ধাপ ২: Python-এ UDF নিবন্ধন

Python-এ create_function ব্যবহার করে কাস্টম ফাংশনটি SQLite-এ নিবন্ধিত করা হয়। এখানে add_numbers ফাংশনটি দুটি আর্গুমেন্ট নিয়ে তাদের যোগফল প্রদান করবে।


UDF ব্যবহার করার সুবিধা

  1. কাস্টম লজিক প্রয়োগ: UDF এর মাধ্যমে আপনি SQLite তে আপনার নিজস্ব কাস্টম লজিক প্রয়োগ করতে পারেন, যা পূর্বনির্ধারিত ফাংশন দ্বারা সম্ভব নয়।
  2. এফিশিয়েন্ট ক্যালকুলেশন: UDF আপনার প্রোগ্রামিং ভাষায় সরাসরি ক্যালকুলেশন করার সুযোগ দেয়, যা অনেক সময় SQL কুয়েরি দ্বারা কঠিন হতে পারে।
  3. ফাংশন পুনরায় ব্যবহারযোগ্যতা: একবার একটি UDF তৈরি করার পর, আপনি সেই ফাংশনটি পুনরায় ব্যবহার করতে পারেন, যা কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।

সারাংশ

User-Defined Functions (UDF) হল কাস্টম SQL ফাংশন যা আপনি SQLite তে তৈরি এবং ব্যবহার করতে পারেন। এটি সাধারণত C, Python, বা অন্যান্য ভাষা ব্যবহার করে তৈরি করা হয়। UDF ব্যবহারের মাধ্যমে আপনি SQL কুয়েরির মধ্যে আপনার নিজের লজিক বা অ্যালগরিদম প্রয়োগ করতে পারেন, যা SQLite তে থাকা স্ট্যান্ডার্ড ফাংশন দিয়ে করা সম্ভব নয়। C বা Python ব্যবহার করে সহজেই SQLite তে কাস্টম ফাংশন নিবন্ধন করা এবং ব্যবহার করা সম্ভব।

Content added By

Stored Procedures তৈরি এবং ব্যবহার

329

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

SQLite তে Stored Procedures এর ধারণা নেই, কারণ এটি সাধারণত SQL Server, MySQL, বা PostgreSQL-এর মতো ডাটাবেস সিস্টেমে ব্যবহৃত হয়। SQLite একটি লাইটওয়েট ডাটাবেস সিস্টেম যা সাধারণত ছোট অ্যাপ্লিকেশন এবং এমবেডেড সিস্টেমের জন্য ব্যবহৃত হয় এবং এটি SQL প্রসেসিংয়ের জন্য প্রাথমিকভাবে ট্রানজেকশন এবং একক SQL স্টেটমেন্টের উপর নির্ভরশীল।

তবে, SQLite-এ Stored Procedures সরাসরি সমর্থিত না হলেও, কিছু সমাধান রয়েছে যা আপনি ব্যাবহার করতে পারেন, যেমন Triggers এবং Views, যা কিছু সীমাবদ্ধতার সঙ্গে Stored Procedures এর মতো কাজ করতে পারে।


১. Triggers ব্যবহার করা

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

Trigger তৈরি করা

ধরা যাক, আপনি একটি sales টেবিলের জন্য একটি ট্রিগার তৈরি করতে চান, যা বিক্রয় পরিমাণ ইনসার্ট করার সময় টেবিলের total_sales কলাম আপডেট করবে।

CREATE TRIGGER update_total_sales
AFTER INSERT ON sales
FOR EACH ROW
BEGIN
    UPDATE products
    SET total_sales = total_sales + NEW.amount
    WHERE product_id = NEW.product_id;
END;

এটি একটি AFTER INSERT ট্রিগার, যার মানে হলো যখন sales টেবিলে নতুন একটি রেকর্ড ইনসার্ট হবে, তখন এটি স্বয়ংক্রিয়ভাবে products টেবিলের total_sales কলাম আপডেট করবে। NEW.amount ব্যবহার করা হয়েছে যেহেতু এটি নতুন রেকর্ডের মান।

Trigger ব্যবহার:

যখন sales টেবিলে নতুন ডেটা ইনসার্ট হবে, তখন এটি total_sales আপডেট করবে:

INSERT INTO sales (product_id, amount) VALUES (1, 100);

এই ট্রিগারের মাধ্যমে total_sales আপডেট হবে।


২. Views ব্যবহার করা

Views হচ্ছে একটি ভিউ বা ভ্যাচুয়াল টেবিল যা একাধিক SQL স্টেটমেন্টের ফলাফল দেখাতে ব্যবহার করা হয়। আপনি যেকোনো জটিল কুয়েরি বা ডাটা ফিল্টার করার কাজটি একটি ভিউতে রাখতে পারেন, যাতে আপনি ঐ কুয়েরিটি বারবার না লিখে শুধু ভিউটি কল করতে পারেন।

View তৈরি করা

CREATE VIEW sales_summary AS
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id;

এটি sales টেবিল থেকে মোট বিক্রয় পরিমাণের একটি ভিউ তৈরি করবে, যা বিভিন্ন পণ্য অনুযায়ী total_sales দেখাবে।

View ব্যবহার করা:

SELECT * FROM sales_summary;

এটি sales_summary ভিউ থেকে ডেটা রিট্রিভ করবে এবং আপনি total_sales দেখতে পারবেন।


৩. SQLite এ Stored Procedures এর সীমাবদ্ধতা

SQLite সরাসরি Stored Procedures সমর্থন না করলেও, আপনি Triggers এবং Views এর মাধ্যমে কিছু কার্যকারিতা তৈরি করতে পারেন। তবে SQLite এর প্রধান সুবিধা হল এর সরলতা এবং লাইটওয়েট প্রকৃতি, যা ছোট অ্যাপ্লিকেশন এবং মোবাইল ডেটাবেস ব্যবহারের জন্য আদর্শ।

SQLite তে Stored Procedures সম্পূর্ণভাবে সমর্থিত না হলেও, যদি আপনি SQLite এর মাধ্যমে আরও বেশি জটিল ডাটাবেস লজিক পরিচালনা করতে চান, তবে আপনি কিছু অস্থায়ী সমাধান যেমন Triggers, Views, বা অ্যাপ্লিকেশন স্তরে কোড লেখা ব্যবহার করতে পারেন।


সারাংশ

SQLite তে Stored Procedures এর সরাসরি সমর্থন নেই, তবে আপনি Triggers এবং Views ব্যবহার করে কিছু জটিল লজিক এবং ডেটাবেস অপারেশন পরিচালনা করতে পারেন। Triggers ডেটাবেসে নির্দিষ্ট ইভেন্ট ঘটলে স্বয়ংক্রিয়ভাবে SQL অপারেশন চালাতে ব্যবহৃত হয়, এবং Views আপনাকে জটিল কুয়েরি এক্সিকিউট করার জন্য একটি পদ্ধতি প্রদান করে। SQLite এর সরলতা এবং লাইটওয়েট প্রকৃতি থাকলেও, কিছু কার্যকরী সমাধান অবধি এর ব্যবহার সম্ভব।

Content added By

Recursive Functions এর ব্যবহার

333

Recursive Functions এমন ফাংশন যা নিজেরই কল করে। সাধারণভাবে, একটি ফাংশন যখন নিজেকে পুনরায় কল করে এবং কিছু শর্তে থামানো হয়, তখন তাকে recursive function বলা হয়। এটি বিশেষভাবে উপকারী যখন সমস্যা একটি ছোট উপ-সমস্যায় ভাগ করা যায় এবং সমাধানটি একই প্যাটার্নে পুনরাবৃত্তি হয়।


Recursive Functions এর মৌলিক কাঠামো

একটি recursive function সাধারণত দুটি উপাদান ধারণ করে:

  1. Base Case: এটি সেই শর্ত যা ফাংশনটির পুনরাবৃত্তি থামাতে সাহায্য করে। এটি এমন একটি শর্ত যা সত্য হলে ফাংশনটি তার কাজ সম্পন্ন করবে এবং আর কোনো পুনরাবৃত্তি করবে না।
  2. Recursive Case: এটি সেই অংশ যেখানে ফাংশনটি নিজেকে আবার কল করে, সাধারণত সমস্যা ছোট একটি আকারে ভাগ করার জন্য।

Recursive Functions এর উদাহরণ

১. ফ্যাক্টোরিয়াল (Factorial) হিসাব করা

ফ্যাক্টোরিয়াল হল একটি সংখ্যা পর্যন্ত সকল সংখ্যার গুণফল। উদাহরণস্বরূপ, ৫! = ৫ × ৪ × ৩ × ২ × ১।

ফ্যাক্টোরিয়াল (n!) এর রিকার্সিভ হিসাব:

  • n! = n * (n-1)!
  • বেস কেস: 1! = 1
def factorial(n):
    # বেস কেস
    if n == 0 or n == 1:
        return 1
    # রিকার্সিভ কেস
    else:
        return n * factorial(n - 1)

# উদাহরণ
print(factorial(5))  # আউটপুট: 120

এখানে factorial ফাংশনটি নিজেকে কল করছে n - 1 এর সাথে যতক্ষণ না পর্যন্ত n == 1 হয়ে না যায়, তখন বেস কেস (1) রিটার্ন করে এবং ফাংশনটি থামে।


২. ফিবোনাচ্চি সিকোয়েন্স (Fibonacci Sequence)

ফিবোনাচ্চি সিকোয়েন্সের মধ্যে প্রতিটি সংখ্যাটি পূর্ববর্তী দুইটি সংখ্যার যোগফল। উদাহরণস্বরূপ, প্রথম কয়েকটি সংখ্যা হল: ০, ১, ১, ২, ৩, ৫, ৮, ১৩, ২১, ইত্যাদি।

ফিবোনাচ্চি সিকোয়েন্স এর রিকার্সিভ হিসাব:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2)
def fibonacci(n):
    # বেস কেস
    if n == 0:
        return 0
    elif n == 1:
        return 1
    # রিকার্সিভ কেস
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

# উদাহরণ
print(fibonacci(6))  # আউটপুট: 8

এখানে fibonacci ফাংশনটি নিজেকে দুইটি ভাগে কল করছে: n-1 এবং n-2, যতক্ষণ না পর্যন্ত বেস কেস (০ বা ১) পৌঁছায়।


Recursive Functions এর ব্যবহারিক প্রয়োগ

১. ডিরেক্টরি ট্রাভার্সাল (Directory Traversal)

Recursive function সাধারণত ফাইল সিস্টেমের ডিরেক্টরি ট্রাভার্স করার জন্য ব্যবহৃত হয়। যেখানে একটি ডিরেক্টরি যদি অন্য ডিরেক্টরি বা সাবফোল্ডার ধারণ করে, তবে ফাংশনটি নিজেকে আবার কল করে সেই সাবফোল্ডারে গিয়ে ফাইলগুলো দেখতে পারে।

import os

def list_files(directory):
    for file in os.listdir(directory):
        file_path = os.path.join(directory, file)
        if os.path.isdir(file_path):
            list_files(file_path)  # Recursive call if it's a directory
        else:
            print(file_path)

# উদাহরণ
list_files("/path/to/directory")

এখানে list_files ফাংশনটি ডিরেক্টরি যদি একটি সাবডিরেক্টরি থাকে, তবে সেই সাবডিরেক্টরিতেও নিজেকে কল করে। এটি একটি সাধারণ recursive ডিরেক্টরি ট্রাভার্সাল উদাহরণ।


২. বাইনারি সার্চ (Binary Search)

Binary search একটি কার্যকরী এলগরিদম যা একটি সাজানো তালিকায় নির্দিষ্ট একটি মান খোঁজে। এই এলগরিদমে তালিকার মাঝখানে মানটি যাচাই করা হয় এবং তারপর তালিকার অর্ধেক অংশ বাদ দেওয়া হয়, ফলে সমস্যা দ্রুত ছোট হয়ে যায়।

def binary_search(arr, left, right, target):
    if right >= left:
        mid = (left + right) // 2
        # বেস কেস
        if arr[mid] == target:
            return mid
        # রিকার্সিভ কেস
        elif arr[mid] > target:
            return binary_search(arr, left, mid - 1, target)
        else:
            return binary_search(arr, mid + 1, right, target)
    else:
        return -1

# উদাহরণ
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 5
result = binary_search(arr, 0, len(arr) - 1, target)
print(f"Target found at index {result}")  # আউটপুট: 4

এখানে binary_search ফাংশনটি তালিকাটি অর্ধেক করে, তারপর আবার তার বাম বা ডান অর্ধেক অংশে পুনরায় নিজেকে কল করে।


Recursive Functions এর সুবিধা

  1. সহজ কনসেপ্ট: অনেক সমস্যা, বিশেষত গাছ (trees) এবং গ্রাফ (graphs) সম্পর্কিত সমস্যাগুলি রিকার্সিভভাবে সহজে সমাধান করা যায়।
  2. কমপ্যাক্ট কোড: রিকার্সিভ ফাংশন ব্যবহার করলে কোড অনেক সহজ এবং সংক্ষিপ্ত হয়।
  3. ধারণা সহজ: অনেক সময়, যখন সমস্যাটি ছোট উপ-সমস্যায় বিভক্ত করা সম্ভব হয়, তখন রিকার্সিভ সল্যুশন অনেক বেশি প্রাকৃতিক হয়।

Recursive Functions এর সীমাবদ্ধতা

  1. স্ট্যাক ওভারফ্লো: অধিক পুনরাবৃত্তি হওয়ায় স্ট্যাক ওভারফ্লো সমস্যা হতে পারে, যা ডিপ রিকার্সনের ক্ষেত্রে দেখা যায়।
  2. পারফরম্যান্স ইস্যু: কিছু রিকার্সিভ ফাংশন পারফরম্যান্সের দিক থেকে কম কার্যকরী হতে পারে যদি এটি অতিরিক্ত পুনরাবৃত্তি (redundant calls) তৈরি করে।

সারাংশ

Recursive functions এমন একটি ফাংশন যা নিজেকে কল করে এবং এটি বিশেষভাবে তখনই উপকারী যখন সমস্যাটি পুনরাবৃত্তিমূলক বা ধাপে ধাপে সমাধানযোগ্য হয়। এর মাধ্যমে অনেক জটিল সমস্যা যেমন ফ্যাক্টোরিয়াল, ফিবোনাচ্চি সিকোয়েন্স, বাইনারি সার্চ, এবং ডিরেক্টরি ট্রাভার্সাল সহজে সমাধান করা যায়। তবে, অতিরিক্ত রিকার্সন প্রয়োগের ফলে পারফরম্যান্স বা স্ট্যাক ওভারফ্লো সমস্যা হতে পারে, যা মাথায় রেখে এটি ব্যবহার করা উচিত।

Content added By
Promotion

Are you sure to start over?

Loading...