PL/SQL তে Cursor এবং Collection দুটি গুরুত্বপূর্ণ কনসেপ্ট, যা ডেটাবেস অপারেশন পরিচালনার জন্য ব্যবহৃত হয়। এগুলি বিশেষ করে বড় পরিমাণের ডেটা পরিচালনা এবং বিভিন্ন ধরনের ডেটা প্রক্রিয়া করার সময় গুরুত্বপূর্ণ ভূমিকা পালন করে।
1. PL/SQL Cursor
Cursor হলো একটি ডেটাবেস অবজেক্ট, যা SQL কোয়েরির ফলাফল (result set) ধারাবাহিকভাবে প্রসেস করতে ব্যবহৃত হয়। PL/SQL তে, কুয়েরি চালানোর পর রিটার্ন হওয়া একাধিক রেকর্ড বা রো (row) প্রসেস করতে কুরসরের ব্যবহার করা হয়। কুরসরের মাধ্যমে একসাথে একাধিক রেকর্ডের উপর অপারেশন করা যায়।
Cursor এর দুটি ধরন:
- Implicit Cursor (অপেক্ষাকৃত কুরসর):
- Oracle স্বয়ংক্রিয়ভাবে একটি কুয়েরি চালানোর জন্য Implicit Cursor ব্যবহার করে, যেমন
SELECT INTOকোডে। আপনি সাধারণত এটি ই explicitly ডিক্লেয়ার করেন না। উদাহরণ:
DECLARE v_name VARCHAR2(50); BEGIN SELECT first_name INTO v_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE(v_name); END;
- Oracle স্বয়ংক্রিয়ভাবে একটি কুয়েরি চালানোর জন্য Implicit Cursor ব্যবহার করে, যেমন
- Explicit Cursor (স্পষ্ট কুরসর):
- Explicit Cursor আপনি নিজেরাই ডিক্লেয়ার করে ব্যবহার করেন। এটি সাধারণত একাধিক রেকর্ড রিটার্ন করার জন্য ব্যবহৃত হয়। এর মাধ্যমে, কুয়েরি এক্সিকিউট করার পর প্রতিটি রেকর্ড একে একে প্রসেস করা যায়।
উদাহরণ:
DECLARE CURSOR emp_cursor IS SELECT first_name, last_name FROM employees; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_first_name, v_last_name; EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE emp_cursor; END;
Cursor Attributes:
PL/SQL তে, কুরসরের বিভিন্ন স্টেটাস চেক করার জন্য কিছু predefined attributes আছে:
%FOUND: যদি রেকর্ড পাওয়া যায় তবে এটি TRUE।%NOTFOUND: যদি রেকর্ড না পাওয়া যায় তবে এটি TRUE।%ROWCOUNT: মোট কতটি রেকর্ড ফেচ করা হয়েছে তা জানায়।%ISOPEN: কুরসরটি খোলা রয়েছে কিনা তা চেক করে।
2. PL/SQL Collections
Collection হলো একটি ডেটা স্ট্রাকচার, যা একাধিক ভ্যালু একই টাইপের ভ্যারিয়েবল সংরক্ষণ করতে ব্যবহৃত হয়। PL/SQL এ প্রধানত তিন ধরনের কোলেকশন ব্যবহৃত হয়:
- Associative Arrays (Index-By Tables) – এই কোলেকশনটি একটি অ্যারে বা ম্যাপের মত কাজ করে, যেখানে ইনডেক্স হিসেবে বিভিন্ন ধরনের ডাটা ব্যবহার করা যেতে পারে (যেমন সংখ্যামূলক বা স্ট্রিং ইনডেক্স)।
- Nested Tables – এটি একটি অ্যারে হিসাবে কাজ করে, কিন্তু ইনডেক্স শূন্য থেকে শুরু হতে পারে এবং একটি টেবিলের মতো ডাটা সংরক্ষণ করে।
- VARRAY (Variable-Size Arrays) – এটি একটি অ্যারে যা একটি নির্দিষ্ট আকার ধারণ করে এবং এটি একটি সীমাবদ্ধ সংখ্যক উপাদান ধারণ করতে পারে।
Collection এর উদাহরণ:
- Associative Array Example:
DECLARE
TYPE name_array IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
employees name_array;
BEGIN
employees(1) := 'John';
employees(2) := 'Mary';
employees(3) := 'James';
DBMS_OUTPUT.PUT_LINE('Employee at index 1: ' || employees(1));
DBMS_OUTPUT.PUT_LINE('Employee at index 2: ' || employees(2));
DBMS_OUTPUT.PUT_LINE('Employee at index 3: ' || employees(3));
END;
এখানে, employees নামক একটি অ্যাসোসিয়েটিভ অ্যারে ডিক্লেয়ার করা হয়েছে, যা VARCHAR2(50) টাইপের ডাটা ধারণ করবে এবং ইনডেক্স হিসেবে সংখ্যা ব্যবহার করা হচ্ছে।
- Nested Table Example:
DECLARE
TYPE emp_table IS TABLE OF VARCHAR2(50);
emp_names emp_table;
BEGIN
emp_names := emp_table('John', 'Mary', 'James');
FOR i IN 1..emp_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Employee ' || i || ': ' || emp_names(i));
END LOOP;
END;
এখানে, emp_names নামক একটি নেস্টেড টেবিল ডিক্লেয়ার করা হয়েছে এবং তাতে কিছু ভ্যালু অ্যাসাইন করা হয়েছে। তারপর একটি লুপের মাধ্যমে প্রতিটি ভ্যালু প্রিন্ট করা হচ্ছে।
- VARRAY Example:
DECLARE
TYPE dept_array IS VARRAY(3) OF VARCHAR2(50);
departments dept_array;
BEGIN
departments := dept_array('HR', 'Finance', 'IT');
FOR i IN 1..departments.LIMIT LOOP
DBMS_OUTPUT.PUT_LINE('Department ' || i || ': ' || departments(i));
END LOOP;
END;
এখানে, departments নামক একটি ভ্যারিয়েবল সাইজ অ্যারে ডিক্লেয়ার করা হয়েছে যা সর্বোচ্চ ৩টি ডিপার্টমেন্টের নাম ধারণ করতে পারে।
Collection Methods:
PL/SQL তে কোলেকশন পরিচালনার জন্য কিছু built-in মেথড ব্যবহার করা হয়। কিছু সাধারণ মেথড নিচে দেওয়া হলো:
EXTEND: কোলেকশনে নতুন আইটেম যোগ করার জন্য ব্যবহৃত হয়।DELETE: কোলেকশন থেকে একটি বা একাধিক আইটেম মুছে ফেলার জন্য ব্যবহৃত হয়।EXISTS: চেক করে যে কোলেকশনে নির্দিষ্ট ইনডেক্সে আইটেমটি রয়েছে কিনা।COUNT: কোলেকশনের আইটেমের সংখ্যা ফেরত দেয়।
উদাহরণ:
DECLARE
TYPE dept_array IS TABLE OF VARCHAR2(50);
departments dept_array;
BEGIN
-- কোলেকশন তৈরি এবং একাধিক আইটেম যোগ করা
departments := dept_array('HR', 'Finance', 'IT');
departments.EXTEND;
departments(4) := 'Marketing';
DBMS_OUTPUT.PUT_LINE('Total Departments: ' || departments.COUNT);
-- এক আইটেম মুছে ফেলা
departments.DELETE(2);
DBMS_OUTPUT.PUT_LINE('Total Departments after deletion: ' || departments.COUNT);
END;
এখানে EXTEND এবং DELETE মেথড ব্যবহার করা হয়েছে কোলেকশনের আইটেম বাড়ানোর এবং মুছে ফেলার জন্য।
Cursor এবং Collection এর কম্বিনেশন
Cursor এবং Collection একসাথে ব্যবহার করা হয় যখন আপনি অনেক রেকর্ড নিয়ে কাজ করছেন এবং সেই রেকর্ডগুলিকে কোলেকশনে ধারণ করতে চান। উদাহরণস্বরূপ, আপনি একটি cursor ব্যবহার করে ডেটা রিটার্ন করতে পারেন এবং তারপর সেই ডেটা একটি collection এ ফেচ করে প্রয়োজনে প্রসেস করতে পারেন।
উদাহরণ:
DECLARE
TYPE emp_table IS TABLE OF VARCHAR2(50);
emp_names emp_table;
CURSOR emp_cursor IS
SELECT first_name FROM employees WHERE department_id = 10;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor BULK COLLECT INTO emp_names LIMIT 100;
EXIT WHEN emp_cursor%NOTFOUND;
FOR i IN 1..emp_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Employee: ' || emp_names(i));
END LOOP;
END LOOP;
CLOSE emp_cursor;
END;
এখানে, BULK COLLECT INTO ব্যবহার করা হয়েছে, যা কুরসরের রেকর্ডগুলি কোলেকশনে একত্রিত করে এবং তারপর সেগুলি প্রসেস করা হচ্ছে।
উপসংহার
PL/SQL তে Cursor এবং Collection দুটি অত্যন্ত শক্তিশালী টুল যা ডেটাবেসের সাথে ইন্টারঅ্যাকশন করার সময় আরও কার্যকর এবং কার্যক্ষম কোড লেখার সুবিধা প্রদান করে। Cursors আপনাকে ডেটাবেস থেকে একাধিক রেকর্ড প্রসেস করার সুযোগ দেয়, যখন Collections আপনাকে একাধিক ভ্যালু ধরে রাখতে এবং প্রক্রিয়াজাত করতে সক্ষম করে।
Read more