Dynamic SQL হল SQL কোড যা runtime এ তৈরি এবং এক্সিকিউট করা হয়, অর্থাৎ SQL স্টেটমেন্ট তৈরি করার সময় তার বিষয়বস্তু ডাইনামিকভাবে নির্ধারণ করা হয়। PL/SQL তে ডাইনামিক SQL ব্যবহৃত হয় যখন আপনি SQL স্টেটমেন্টের গঠন আগে থেকে জানেন না বা এটি runtime এ তৈরী করতে চান।
PL/SQL তে ডাইনামিক SQL এক্সিকিউট করার জন্য EXECUTE IMMEDIATE বা DBMS_SQL প্যাকেজ ব্যবহার করা হয়। সাধারণত EXECUTE IMMEDIATE ব্যবহার করা বেশি সহজ এবং জনপ্রিয়।
Dynamic SQL এর উদাহরণ:
উদাহরণ ১: EXECUTE IMMEDIATE দিয়ে Dynamic SQL
ধরা যাক, আমাদের একটি employees টেবিল আছে এবং আমরা এমন একটি SQL স্টেটমেন্ট চাই যা বিভিন্ন কলাম থেকে ডেটা রিটার্ন করবে, এবং আমরা কলামটি runtime এ নির্ধারণ করব।
DECLARE
v_column_name VARCHAR2(30); -- Variable to hold column name
v_sql_query VARCHAR2(200); -- Variable to hold dynamic SQL query
BEGIN
v_column_name := 'salary'; -- Set the column name dynamically, could be any column like 'salary', 'first_name', etc.
-- Constructing the SQL query dynamically
v_sql_query := 'SELECT ' || v_column_name || ' FROM employees WHERE department_id = :dept_id';
-- Executing the dynamic SQL query
EXECUTE IMMEDIATE v_sql_query USING 10; -- dept_id = 10 is passed as bind variable
END;
বিশদ ব্যাখ্যা:
- এখানে
v_column_nameনামক একটি ভেরিয়েবল ব্যবহার করে আমরা ডাইনামিকভাবে কলামটি নির্ধারণ করছি। v_sql_queryতে আমরা ডাইনামিক SQL কুইরি তৈরি করছি।EXECUTE IMMEDIATEব্যবহার করে আমরা ডাইনামিক SQL কোডটি চালাচ্ছি, যেখানে:dept_idহলো একটি bind variable।
উদাহরণ ২: Dynamic SQL with INSERT
ধরা যাক, আমাদের কাছে একটি টেবিল আছে এবং আমরা ডাইনামিকভাবে বিভিন্ন কলামে ডেটা ইনসার্ট করতে চাই।
DECLARE
v_table_name VARCHAR2(30) := 'employees'; -- Table name
v_column1 VARCHAR2(30) := 'employee_id'; -- Column 1
v_column2 VARCHAR2(30) := 'first_name'; -- Column 2
v_value1 NUMBER := 123; -- Value for column 1
v_value2 VARCHAR2(50) := 'John Doe'; -- Value for column 2
v_sql_query VARCHAR2(200); -- Dynamic SQL query variable
BEGIN
-- Constructing the dynamic SQL query for INSERT
v_sql_query := 'INSERT INTO ' || v_table_name || ' (' || v_column1 || ', ' || v_column2 || ') VALUES (:val1, :val2)';
-- Executing the dynamic SQL query
EXECUTE IMMEDIATE v_sql_query USING v_value1, v_value2;
DBMS_OUTPUT.PUT_LINE('Data inserted successfully!');
END;
বিশদ ব্যাখ্যা:
- এখানে আমরা INSERT INTO কুইরি ডাইনামিকভাবে তৈরি করছি এবং কলাম ও টেবিলের নামও ডাইনামিকভাবে নির্ধারণ করছি।
EXECUTE IMMEDIATEদিয়ে ডাইনামিক SQL এক্সিকিউট করছি এবং bind variables হিসেবেv_value1এবংv_value2ব্যবহার করছি।
উদাহরণ ৩: Dynamic SQL with SELECT and Returning Data
এখন, যদি আমরা ডাইনামিক SQL ব্যবহার করে কোনো SELECT স্টেটমেন্ট চালাতে চাই এবং সেই ডেটা কিভাবে রিটার্ন করতে পারি, তা দেখানো যাক।
DECLARE
v_column_name VARCHAR2(30) := 'salary'; -- The column to be fetched dynamically
v_dept_id NUMBER := 10; -- Department ID
v_salary NUMBER; -- Variable to store result
v_sql_query VARCHAR2(200); -- Dynamic SQL query variable
BEGIN
-- Constructing dynamic SQL for SELECT query
v_sql_query := 'SELECT ' || v_column_name || ' FROM employees WHERE department_id = :dept_id';
-- Execute dynamic SQL and fetch the result into v_salary
EXECUTE IMMEDIATE v_sql_query INTO v_salary USING v_dept_id;
-- Output the result
DBMS_OUTPUT.PUT_LINE('Salary of employee in department ' || v_dept_id || ' is: ' || v_salary);
END;
বিশদ ব্যাখ্যা:
- এখানে আমরা SELECT কুইরি ডাইনামিকভাবে তৈরি করছি, যেখানে কলামটি এবং টেবিলের শর্ত runtime এ নির্ধারণ করা হয়েছে।
EXECUTE IMMEDIATEদিয়ে SQL কুইরি এক্সিকিউট করে আমরা INTO ক্লজ ব্যবহার করে ডেটাv_salaryভেরিয়েবলে রিটার্ন করছি।
Dynamic SQL এর সুবিধা:
- Flexibility: কোডে বিভিন্ন অংশ ডাইনামিকভাবে পরিবর্তন করতে সক্ষম হওয়া, যেমন টেবিল বা কলামের নাম runtime এ নির্ধারণ করা।
- Reusable Code: একই কোড দিয়ে বিভিন্ন ধরনের SQL কুইরি এক্সিকিউট করা সম্ভব।
- Complex Queries: জটিল বা পরিবর্তিত SQL কুইরি তৈরি করতে Dynamic SQL ব্যবহৃত হতে পারে।
Dynamic SQL এর নিরাপত্তা:
ডাইনামিক SQL ব্যবহারের সময় SQL Injection রোধ করতে বেশ কিছু সাবধানতা অবলম্বন করা উচিত:
- Bind Variables ব্যবহার করা: যেভাবে উপরে দেখানো হয়েছে,
:dept_id,:val1,:val2এগুলোকে bind variables হিসেবে ব্যবহার করা SQL injection থেকে রক্ষা করে। - Validation: ইনপুট ভ্যালুগুলোর ভালোভাবে যাচাই করা উচিত যাতে তা অবাঞ্ছিত SQL কোড ইনজেকশনের সুযোগ না দেয়।
সারাংশ:
- Dynamic SQL হল এমন SQL কোড যা runtime এ তৈরি এবং এক্সিকিউট করা হয়।
- PL/SQL তে EXECUTE IMMEDIATE বা DBMS_SQL প্যাকেজ ব্যবহার করে ডাইনামিক SQL চালানো সম্ভব।
- এটি flexibility এবং reusability প্রদান করে, বিশেষ করে যখন SQL কুইরির গঠন আগে থেকে জানা থাকে না।
Read more