PL/SQL-এ Dynamic SQL ব্যবহার করা হয় যখন SQL স্টেটমেন্টগুলি প্রোগ্রামের চলাকালীন সময়ে তৈরি বা পরিবর্তন করা হয়। EXECUTE IMMEDIATE এবং DBMS_SQL দুটি উপায় রয়েছে Dynamic SQL বাস্তবায়নের জন্য। এগুলোর মাধ্যমে ডাইনামিক SQL স্টেটমেন্ট কার্যকর করা যায়, যার মাধ্যমে বিভিন্ন ধরনের SQL স্টেটমেন্ট (যেমন, INSERT, UPDATE, DELETE, SELECT) চলমান সময়ে তৈরি এবং সম্পাদন করা সম্ভব।
১. EXECUTE IMMEDIATE (Dynamic SQL)
EXECUTE IMMEDIATE হল PL/SQL-এর একটি সরল এবং সবচেয়ে প্রচলিত উপায় Dynamic SQL নির্বাহ করার জন্য। এটি ব্যবহার করা হয় সাধারণ SQL স্টেটমেন্ট কার্যকর করতে। EXECUTE IMMEDIATE স্টেটমেন্টটি সরাসরি SQL স্ট্রিং গ্রহণ করে এবং সেই SQL স্টেটমেন্টটি প্ল/এসকিউএল ব্লকের মধ্যে কার্যকর করে।
Syntax:
EXECUTE IMMEDIATE 'SQL_statement' [INTO variable_name] [USING bind_variable];
SQL_statement: ডাইনামিক SQL স্টেটমেন্ট।INTO variable_name: ঐচ্ছিক, ডাটাবেস থেকে রিটার্ন করা মান একটি ভেরিয়েবলে রাখতে ব্যবহার করা হয়।USING bind_variable: ঐচ্ছিক, ডাইনামিক SQL-এ ব্যন্ড ভেরিয়েবল ব্যবহারের জন্য।
উদাহরণ ১: SELECT Statement:
DECLARE
v_employee_name VARCHAR2(50);
BEGIN
EXECUTE IMMEDIATE 'SELECT first_name FROM employees WHERE employee_id = 101' INTO v_employee_name;
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
END;
এখানে, EXECUTE IMMEDIATE দ্বারা SELECT স্টেটমেন্টটি চালানো হয়েছে এবং ফলস্বরূপ v_employee_name-এ মান স্টোর হয়েছে।
উদাহরণ ২: DML Statement (INSERT/UPDATE/DELETE):
BEGIN
EXECUTE IMMEDIATE 'UPDATE employees SET salary = 5000 WHERE employee_id = 101';
COMMIT;
DBMS_OUTPUT.PUT_LINE('Salary updated successfully.');
END;
এটি UPDATE স্টেটমেন্টের মাধ্যমে ডাইনামিক SQL-কে কার্যকর করেছে এবং পরবর্তীতে COMMIT স্টেটমেন্ট দ্বারা পরিবর্তনগুলি নিশ্চিত করা হয়েছে।
উদাহরণ ৩: Bind Variables ব্যবহার:
DECLARE
v_salary NUMBER := 3000;
BEGIN
EXECUTE IMMEDIATE 'UPDATE employees SET salary = :new_salary WHERE employee_id = 101' USING v_salary;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Salary updated successfully.');
END;
এখানে :new_salary একটি bind variable হিসেবে ব্যবহৃত হয়েছে, যার মান v_salary থেকে নেয়া হয়েছে।
২. DBMS_SQL (Dynamic SQL)
DBMS_SQL হল PL/SQL-এর একটি প্যাকেজ, যা আরও জটিল Dynamic SQL কার্যকর করতে ব্যবহৃত হয়। এটি সেই পরিস্থিতিতে ব্যবহৃত হয় যখন SQL স্টেটমেন্টটি runtime-এ আরও বেশি কাস্টমাইজড বা নমনীয় হতে হয়। DBMS_SQL স্টেটমেন্টের মাধ্যমে SQL স্টেটমেন্টকে পরিপূর্ণভাবে প্রোগ্রাম্যাটিক্যালি প্রসেস করা হয়।
Syntax:
DECLARE
v_cursor INTEGER;
BEGIN
v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor, 'SQL_statement', DBMS_SQL.NATIVE);
DBMS_SQL.EXECUTE(v_cursor);
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END;
OPEN_CURSOR: একটি কিউরসর খুলে, যা ডাইনামিক SQL স্টেটমেন্ট রিচ করতে ব্যবহার করা হয়।PARSE: কিউরসর দ্বারা SQL স্টেটমেন্ট পার্স করা হয়।EXECUTE: SQL স্টেটমেন্ট কার্যকর করা হয়।CLOSE_CURSOR: কিউরসর বন্ধ করা হয়।
উদাহরণ ১: SELECT Statement:
DECLARE
v_cursor INTEGER;
v_employee_name VARCHAR2(50);
BEGIN
v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor, 'SELECT first_name FROM employees WHERE employee_id = 101', DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(v_cursor, 1, v_employee_name, 50);
DBMS_SQL.EXECUTE(v_cursor);
DBMS_SQL.FETCH_ROWS(v_cursor);
DBMS_SQL.COLUMN_VALUE(v_cursor, 1, v_employee_name);
DBMS_SQL.CLOSE_CURSOR(v_cursor);
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
END;
এখানে, DBMS_SQL.OPEN_CURSOR এবং DBMS_SQL.PARSE ব্যবহার করে কিউরসর খোলা এবং SQL স্টেটমেন্ট কার্যকর করা হয়েছে। DBMS_SQL.DEFINE_COLUMN দ্বারা কলাম ভ্যালু ডিফাইন করা হয়েছে এবং পরবর্তীতে DBMS_SQL.COLUMN_VALUE দ্বারা রিটার্ন ভ্যালু সংগ্রহ করা হয়েছে।
উদাহরণ ২: DML Statement (INSERT/UPDATE/DELETE):
DECLARE
v_cursor INTEGER;
BEGIN
v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor, 'UPDATE employees SET salary = :new_salary WHERE employee_id = 101', DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(v_cursor, ':new_salary', 5000);
DBMS_SQL.EXECUTE(v_cursor);
COMMIT;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
DBMS_OUTPUT.PUT_LINE('Salary updated successfully.');
END;
এখানে, DBMS_SQL.BIND_VARIABLE ব্যবহার করে new_salary নামের bind variable বেঁধে দেওয়া হয়েছে এবং DBMS_SQL.EXECUTE দ্বারা UPDATE স্টেটমেন্ট কার্যকর করা হয়েছে।
EXECUTE IMMEDIATE এবং DBMS_SQL এর তুলনা
| Feature | EXECUTE IMMEDIATE | DBMS_SQL |
|---|---|---|
| Ease of Use | সহজ এবং সরল, বিশেষ করে সাধারণ SQL স্টেটমেন্টের জন্য | বেশি নমনীয়, তবে জটিল এবং অতিরিক্ত কনফিগারেশন প্রয়োজন |
| Performance | উচ্চ পারফরমেন্স, সাধারণ SQL স্টেটমেন্টের জন্য | কাস্টমাইজড এবং জটিল SQL-এ বেশি উপযুক্ত, তবে একটু ধীর হতে পারে |
| Flexibility | কিছুটা সীমিত, সাধারণত একক SQL স্টেটমেন্টের জন্য | অধিক নমনীয়, বিভিন্ন SQL স্টেটমেন্টের জন্য ব্যবহৃত হতে পারে |
| Bind Variables | সহজভাবে সমর্থিত | কঠিন, তবে সম্পূর্ণ নিয়ন্ত্রণ সম্ভব |
| Use Cases | সাধারণ DML এবং SELECT স্টেটমেন্ট | জটিল ডাইনামিক SQL, কিউরসর ব্যবস্থাপনা, অনেক কলাম সহ স্টেটমেন্ট |
সংক্ষেপে:
- EXECUTE IMMEDIATE হল PL/SQL-এ ডাইনামিক SQL কার্যকর করার সহজ এবং কার্যকরী পদ্ধতি, যা সাধারণত একক SQL স্টেটমেন্টের জন্য ব্যবহৃত হয়।
- DBMS_SQL হল একটি শক্তিশালী প্যাকেজ যা আরও জটিল এবং কাস্টমাইজড SQL স্টেটমেন্ট বাস্তবায়নের জন্য ব্যবহৃত হয়, যেখানে কিউরসর ব্যবস্থাপনা এবং bind ভেরিয়েবল ব্যবহৃত হতে পারে।
EXECUTE IMMEDIATE সরলতা এবং গতি প্রদান করে, তবে DBMS_SQL বেশি নমনীয় এবং কাস্টমাইজড SQL স্টেটমেন্টের জন্য উপযুক্ত।