CURSOR কি এবং কিভাবে কাজ করে?

Cursors এবং তাদের ব্যবহার - টি-এসকিউএল (T-SQL) - Database Tutorials

1.2k

CURSOR হলো একটি ডেটাবেস অবজেক্ট যা T-SQL-এ ব্যবহৃত হয় এবং এটি Row-by-Row Processing বা অর্থাৎ রেকর্ড ভিত্তিক প্রক্রিয়া পরিচালনা করতে সাহায্য করে। যখন আপনি কোনো কুয়েরি চালান, তখন SQL Server পুরো টেবিল বা ডেটা সেগমেন্টে একবারে কাজ করে, তবে কিছু ক্ষেত্রে আপনি একেকটি রেকর্ডকে পর্যায়ক্রমে বা একে একে প্রক্রিয়া করতে চান। এই কাজটি CURSOR এর মাধ্যমে করা হয়।

CURSOR একাধিক রেকর্ডের উপর কাজ করার জন্য একটি টুল, তবে এটি SET-BASED পদ্ধতির পরিবর্তে ROW-BASED পদ্ধতি ব্যবহার করে, যা ডেটার প্রতি রেকর্ড আলাদাভাবে কাজ করে।

CURSOR এর ধারণা

CURSOR হল একটি ডেটাবেস অবজেক্ট যা ডেটাবেস টেবিলের রেকর্ডগুলিকে একটি সারির মধ্যে ইটারেট বা পর্যায়ক্রমে প্রসেস করতে ব্যবহৃত হয়। সাধারণত, SET-BASED অপারেশনগুলো দ্রুত হয়, কিন্তু যখন আপনার Row-by-Row অপারেশন প্রয়োজন হয়, তখন CURSOR উপকারী হতে পারে।

CURSOR এর মূল কাজের পদক্ষেপ:

  1. DECLARE: প্রথমে ক্যানভাস তৈরি করতে CURSOR ডিফাইন করতে হয়।
  2. OPEN: CURSOR ওপেন করার মাধ্যমে, টেবিল বা কুয়েরি রেজাল্টের মধ্যে রেকর্ডগুলো একত্রিত করা হয়।
  3. FETCH: একে একে রেকর্ডগুলোকে FETCH কমান্ডের মাধ্যমে প্রক্রিয়া করা হয়।
  4. CLOSE: যখন সব রেকর্ড প্রক্রিয়া করা হয়ে যায়, তখন CURSOR বন্ধ করা হয়।
  5. DEALLOCATE: CURSOR রিসোর্স মুক্ত করতে DEALLOCATE কমান্ড ব্যবহার করা হয়।

CURSOR এর সিনট্যাক্স:

DECLARE cursor_name CURSOR FOR
    SELECT column1, column2
    FROM table_name
    WHERE condition;

OPEN cursor_name;

FETCH NEXT FROM cursor_name INTO @var1, @var2;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Process each row here

    FETCH NEXT FROM cursor_name INTO @var1, @var2;
END;

CLOSE cursor_name;
DEALLOCATE cursor_name;

CURSOR এর উদাহরণ

ধরা যাক, একটি Employees টেবিল আছে, যেখানে EmployeeID, FirstName, LastName কলাম রয়েছে। আপনি যদি প্রতিটি কর্মচারীর তথ্য নিয়ে কিছু কাজ করতে চান, তাহলে আপনি CURSOR ব্যবহার করতে পারেন।

DECLARE @EmployeeID INT, @FirstName VARCHAR(50), @LastName VARCHAR(50);

DECLARE EmployeeCursor CURSOR FOR
SELECT EmployeeID, FirstName, LastName
FROM Employees;

OPEN EmployeeCursor;

FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @FirstName, @LastName;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- এখানে আপনি রেকর্ডের উপর কাজ করতে পারেন
    PRINT 'Employee ID: ' + CAST(@EmployeeID AS VARCHAR(10)) + ', Name: ' + @FirstName + ' ' + @LastName;

    -- পরবর্তী রেকর্ডে যান
    FETCH NEXT FROM EmployeeCursor INTO @EmployeeID, @FirstName, @LastName;
END;

CLOSE EmployeeCursor;
DEALLOCATE EmployeeCursor;

এখানে:

  • DECLARE: EmployeeCursor নামে একটি CURSOR তৈরি করা হয়েছে যা Employees টেবিলের EmployeeID, FirstName, এবং LastName রেকর্ড গুলো ধারণ করবে।
  • FETCH NEXT: একে একে রেকর্ড গুলি পড়া এবং পরবর্তী রেকর্ডে যাওয়া।
  • @@FETCH_STATUS: এটি চেক করে যে, বর্তমানে CURSOR কোনো রেকর্ড নিয়ে কাজ করছে কিনা।

CURSOR এর প্রকার

  1. STATIC CURSOR: এটি ডেটা সংগ্রহ করে এবং যেকোনো পরিবর্তন থেকে আলাদা হয়ে কাজ করে। এটি রেকর্ডগুলির মধ্যে পরিবর্তন মেনে চলে না।
  2. DYNAMIC CURSOR: এটি টেবিলের বা কুয়েরির রেকর্ডে করা সকল পরিবর্তন মেনে চলে। এর মানে, যদি অন্য ব্যবহারকারী কোনো রেকর্ড আপডেট বা ডিলিট করে, তাহলে DYNAMIC CURSOR সেই পরিবর্তন গ্রহণ করবে।
  3. FORWARD_ONLY CURSOR: এটি শুধুমাত্র FETCH NEXT অপারেশন চালায় এবং পূর্ববর্তী রেকর্ডে ফিরে যেতে পারে না। এটি দ্রুততর এবং কম রিসোর্স ব্যবহার করে।
  4. KEYSET CURSOR: এটি একটি স্থির কাস্টম কুয়েরি রেজাল্ট তৈরি করে এবং কুয়েরির সময় পরিবর্তিত রেকর্ডগুলিতে অ্যাক্সেস পায়।

CURSOR ব্যবহারের প্রয়োজনীয়তা

  1. Row-by-Row Processing: যখন আপনি একটি কুয়েরি থেকে রেকর্ডগুলোকে একে একে প্রক্রিয়া করতে চান, তখন CURSOR ব্যবহার করা হয়।
  2. Complex Calculations: যদি আপনাকে একটি কুয়েরির উপর কঠিন বা জটিল গণনা করতে হয় যা SET-BASED পদ্ধতিতে করা সম্ভব না, তাহলে CURSOR সহায়ক হতে পারে।
  3. Dealing with Hierarchical Data: Recursive Data বা Tree Structures এর ক্ষেত্রে CURSOR কার্যকরী হতে পারে।

CURSOR এর সমস্যা এবং এর প্রতিকার

  1. Performance Issues: CURSOR সাধারণত SET-BASED পদ্ধতির তুলনায় কম কার্যকরী, কারণ এটি প্রতিটি রেকর্ডের উপর আলাদা করে কাজ করে, যা কার্যক্ষমতা কমাতে পারে।

    প্রতিকার: যখন সম্ভব, CURSOR এর পরিবর্তে JOINs এবং CTEs ব্যবহার করার চেষ্টা করুন।

  2. Resource Intensive: CURSOR ব্যবহার করার সময় CPU এবং Memory বেশী ব্যবহার হয়, কারণ এটি একে একে প্রতিটি রেকর্ড প্রসেস করে।

    প্রতিকার: শুধুমাত্র খুব প্রয়োজনীয় ক্ষেত্রে CURSOR ব্যবহার করুন এবং OPEN এবং CLOSE করার পরে DEALLOCATE করা নিশ্চিত করুন।


সারাংশ

CURSOR একটি T-SQL অবজেক্ট যা Row-by-Row ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। এটি একে একে রেকর্ড প্রসেস করার জন্য কার্যকরী হতে পারে, তবে এটি SET-BASED পদ্ধতির চেয়ে কম কার্যকরী এবং কম্পিউটার রিসোর্স বেশি ব্যবহার করে। CURSOR সাধারণত জটিল বা রিকর্ষিভ ডেটা প্রক্রিয়াকরণে ব্যবহৃত হয়, তবে পারফরম্যান্সের দিক থেকে যখন সম্ভব, তখন JOIN বা CTE ব্যবহার করা উচিত।

Content added By
Promotion

Are you sure to start over?

Loading...