PL/SQL Exception Handling

Database Tutorials - পিএল/এসকিউএল (PL/SQL)
158
158

PL/SQL তে Exception Handling হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে রানটাইমের সময় উদ্ভূত ত্রুটিগুলির (errors) সঠিকভাবে পরিচালনা করার সুযোগ দেয়। এর মাধ্যমে আপনি নির্দিষ্ট ত্রুটি ঘটলে সেগুলি ধরতে, প্রক্রিয়া করতে এবং উপযুক্ত বার্তা প্রদর্শন করতে পারেন।

PL/SQL তে exception হল একটি সংকেত যা ফাংশন, প্রোসিডিউর বা ব্লকের এক্সিকিউশনের সময় ঘটে। যখন কোনো ত্রুটি ঘটে, তখন এটি সাধারণত exception block এর মাধ্যমে পরিচালিত হয়।


Exception Handling এর গঠন:

PL/SQL এর exception handling সাধারণত তিনটি প্রধান অংশে বিভক্ত:

  1. Predefined Exceptions (পূর্বনির্ধারিত ত্রুটিগুলি)
  2. User-defined Exceptions (ব্যবহারকারীর সংজ্ঞায়িত ত্রুটি)
  3. Exception Block (ত্রুটি ব্লক)

Exception Handling Block:

PL/SQL তে exception handling করার জন্য একটি EXCEPTION ব্লক ব্যবহার করা হয়, যা BEGIN...END ব্লকের পরে আসে।

সিনট্যাক্স:

BEGIN
   -- Normal PL/SQL code (procedures, SQL queries, etc.)
   
EXCEPTION
   -- Exception handling code (handling errors)
   WHEN exception_name THEN
      -- Action to be taken when exception occurs
   WHEN OTHERS THEN
      -- Default handler for all other exceptions
END;

1. Predefined Exceptions (পূর্বনির্ধারিত ত্রুটি)

PL/SQL তে কিছু সাধারণ ত্রুটি (predefined exceptions) থাকে যা স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়। কিছু সাধারণ predefined exceptions:

ধারণা:

  • NO_DATA_FOUND: যখন একটি SELECT INTO কুইরি কোনো রেকর্ড ফেরত দেয় না।
  • TOO_MANY_ROWS: যখন একটি SELECT INTO কুইরি একাধিক রেকর্ড ফেরত দেয়।
  • ZERO_DIVIDE: যখন আপনি ০ দিয়ে ভাগ করার চেষ্টা করেন।
  • DUP_VAL_ON_INDEX: যখন ডুপ্লিকেট ভ্যালু দিয়ে ইনডেক্স বা প্রাইমারি কনস্ট্রেইন্ট ভায়olation হয়।

উদাহরণ:

DECLARE
   v_employee_name employees.employee_name%TYPE;
BEGIN
   -- Trying to fetch employee name where ID = 100
   SELECT employee_name INTO v_employee_name FROM employees WHERE employee_id = 100;
   
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No employee found with the specified ID.');
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('Multiple employees found with the same ID.');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('An unexpected error occurred.');
END;

এখানে, যদি employee_id = 100 এর জন্য কোনো রেকর্ড না পাওয়া যায়, তাহলে NO_DATA_FOUND exception হ্যান্ডেল হবে এবং একটি বার্তা প্রদর্শিত হবে।


2. User-defined Exceptions (ব্যবহারকারীর সংজ্ঞায়িত ত্রুটি)

PL/SQL তে আপনি নিজের exception তৈরি করতে পারেন। এটি করার জন্য, আপনাকে প্রথমে একটি exception variable ডিক্লেয়ার করতে হবে এবং তারপর প্রয়োজনীয় স্থানে তাকে raise করতে হবে।

সিনট্যাক্স:

DECLARE
   -- Define user-defined exception
   insufficient_funds EXCEPTION;
BEGIN
   -- Some logic here, if condition occurs
   IF account_balance < withdrawal_amount THEN
      -- Raise the user-defined exception
      RAISE insufficient_funds;
   END IF;
EXCEPTION
   WHEN insufficient_funds THEN
      DBMS_OUTPUT.PUT_LINE('Insufficient funds for withdrawal.');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('An unexpected error occurred.');
END;

এখানে, insufficient_funds একটি user-defined exception যা ব্যবহার করা হয়েছে যখন কোনো অ্যাকাউন্টে পর্যাপ্ত টাকা না থাকে।


3. Exception Handling with RAISE and RAISE_APPLICATION_ERROR

  • RAISE: এই কমান্ডটি একটি user-defined exception বা পূর্বনির্ধারিত exception trigger করতে ব্যবহৃত হয়।
  • RAISE_APPLICATION_ERROR: এটি একটি user-defined exception তৈরি করতে ব্যবহৃত হয় যা একটি নির্দিষ্ট ত্রুটি কোড এবং বার্তা প্রদান করে।

RAISE:

DECLARE
   insufficient_balance EXCEPTION;
BEGIN
   -- Some logic
   IF account_balance < 0 THEN
      RAISE insufficient_balance;
   END IF;
EXCEPTION
   WHEN insufficient_balance THEN
      DBMS_OUTPUT.PUT_LINE('Account balance is negative.');
END;

RAISE_APPLICATION_ERROR:

RAISE_APPLICATION_ERROR একটি বিল্ট-ইন PL/SQL procedure যা একটি নির্দিষ্ট ত্রুটি কোড এবং বার্তা প্রদান করতে ব্যবহৃত হয়। এটি সাধারণত ব্যবহারকারীর ডিফাইন করা ত্রুটির জন্য ব্যবহৃত হয়, যেখানে কোড -20000 থেকে -20999 এর মধ্যে হতে পারে।

DECLARE
   insufficient_funds EXCEPTION;
BEGIN
   -- Some logic
   IF account_balance < withdrawal_amount THEN
      RAISE_APPLICATION_ERROR(-20001, 'Insufficient funds for withdrawal.');
   END IF;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;

এখানে, RAISE_APPLICATION_ERROR(-20001, 'Insufficient funds for withdrawal.') ব্যবহার করা হয়েছে একটি কাস্টম ত্রুটি কোড এবং বার্তা তৈরি করার জন্য।


4. WHEN OTHERS (সাধারণ Exception Handler)

যখন নির্দিষ্ট exception ধরতে না পারি, তখন WHEN OTHERS ব্যবহার করা হয়। এটি সাধারণত একটি ফোলব্যাক মেকানিজম হিসেবে ব্যবহৃত হয় এবং এটি সব ধরনের ত্রুটির জন্য প্রযোজ্য।

উদাহরণ:

DECLARE
   v_employee_id employees.employee_id%TYPE;
BEGIN
   -- Attempt to fetch an employee ID
   SELECT employee_id INTO v_employee_id FROM employees WHERE employee_name = 'John Doe';
   
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No employee found with that name.');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;

এখানে, যদি কোনো অন্যান্য ত্রুটি ঘটে (যেমন ডাটা টাইপ বা অন্য সমস্যা), তাহলে WHEN OTHERS ব্লকটি চালু হবে এবং সঠিক ত্রুটি বার্তা প্রদর্শন করবে।


Exception Handling - Best Practices

  1. Exception Logging: সব ধরনের exception এর জন্য একটি লগ তৈরি করুন যাতে আপনি সমস্যা বুঝতে পারেন এবং পরে তা সমাধান করতে পারেন।
  2. Specific Exception Handling: যতটা সম্ভব নির্দিষ্ট exception handle করুন, যাতে আপনি ত্রুটির কারণ এবং তার সমাধান পরিষ্কারভাবে দেখতে পারেন।
  3. Avoid Overuse of WHEN OTHERS: WHEN OTHERS ব্যবহার করবেন শুধুমাত্র তখন যখন আপনি সত্যিই নিশ্চিত নন যে কোন exception ঘটতে পারে।
  4. Raise Custom Errors: প্রয়োজনে user-defined exceptions বা custom errors ব্যবহার করুন যাতে আপনার কোডের error handling আরও শক্তিশালী হয়।

সারাংশ:

  • PL/SQL Exception Handling একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে রানটাইম ত্রুটি শনাক্ত করতে এবং সেগুলি পরিচালনা করতে সক্ষম করে।
  • আপনি Predefined Exceptions বা User-defined Exceptions ব্যবহার করতে পারেন, এবং RAISE এবং RAISE_APPLICATION_ERROR ব্যবহার করে ত্রুটি ফেলে দিতে পারেন।
  • WHEN OTHERS ব্লক ব্যবহার করে আপনি সব ধরনের unforeseen errors ধরতে পারেন।
  • exception handling ব্যবহার করলে কোড আরও স্থিতিশীল এবং নির্ভরযোগ্য হয়, কারণ ত্রুটির ক্ষেত্রে আপনার অ্যাপ্লিকেশন ব্যর্থ না হয়ে সঠিকভাবে সাড়া দেয়।
Content added By

Exception Handling এর ধারণা

95
95

Exception Handling PL/SQL এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা কোডের চলাকালীন সময়ে হওয়া ত্রুটি (errors) সঠিকভাবে পরিচালনা করতে সহায়ক। Exception হল একটি অপ্রত্যাশিত ঘটনা যা কোডের এক্সিকিউশন থামিয়ে দেয়। PL/SQL তে Exception Handling ব্যবহার করে, আপনি ত্রুটিগুলি সঠিকভাবে ধরতে, প্রক্রিয়া চালিয়ে যেতে এবং ব্যবহারকারীকে কার্যকরীভাবে ত্রুটি সম্পর্কে জানাতে পারেন।


Exception Handling এর প্রয়োজনীয়তা

কোনও প্রোগ্রাম যখন চালানো হয়, তখন অনেক ধরণের ত্রুটি ঘটতে পারে। এই ত্রুটিগুলি যদি ঠিকভাবে পরিচালিত না হয়, তবে প্রোগ্রামটি বন্ধ হয়ে যেতে পারে বা ভুল ফলাফল দিতে পারে। PL/SQL এর exception handling এর মাধ্যমে:

  1. কোডের স্থিরতা বজায় রাখা: ত্রুটির কারণে প্রোগ্রাম বন্ধ না হয়ে তার পরবর্তী অংশ চালিয়ে যেতে পারে।
  2. ত্রুটির সঠিক পরিচালনা: ত্রুটির কারণ এবং প্রক্রিয়া সম্পর্কে ব্যবহারকারীকে স্পষ্ট বার্তা প্রদানের মাধ্যমে ডিবাগিং সহজ করা।
  3. সিস্টেম রিসোর্সের সুরক্ষা: অনেক সময় ত্রুটির কারণে ডেটাবেস লক, রিসোর্স লিক, কিংবা অসম্পূর্ণ ট্রানজেকশন হতে পারে, যা exception handling দ্বারা প্রতিরোধ করা যায়।

PL/SQL Exception Handling ব্লক গঠন

PL/SQL তে exception handling সাধারণত তিনটি প্রধান ব্লক দিয়ে সম্পন্ন হয়:

  1. Declare Block: এখানে আপনি যে Exception গুলি ধরা হবে তা ডিক্লেয়ার করেন।
  2. Begin Block: এখানে কোডের কার্যকর অংশ থাকে, যেখানে ত্রুটি ঘটতে পারে।
  3. Exception Block: এখানে ত্রুটিগুলি ধরা এবং সেগুলির জন্য নির্ধারিত কার্যাবলী সম্পাদন করা হয়।

Syntax:

BEGIN
   -- Normal execution code
EXCEPTION
   WHEN exception_name THEN
      -- Exception handling code
   WHEN OTHERS THEN
      -- Code to handle all other exceptions
END;

Example:

ধরা যাক, আপনি একটি ডেটাবেসে কর্মচারীর বেতন আপডেট করার চেষ্টা করছেন এবং সেই বেতন যদি শূন্য (zero) হয় তবে একটি ত্রুটি ঘটতে পারে।

DECLARE
   v_salary NUMBER := 0;
BEGIN
   -- Attempt to update employee salary
   UPDATE employees
   SET salary = v_salary
   WHERE employee_id = 101;
   
   -- If salary is zero, trigger an exception
   IF v_salary = 0 THEN
      RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be zero.');
   END IF;
   
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No records found for update.');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;

এখানে, NO_DATA_FOUND এবং OTHERS নামক দুটি exception ব্যবহৃত হয়েছে:

  • NO_DATA_FOUND: যদি কোনো রেকর্ড পাওয়া না যায়, তখন এটি পরিচালনা করবে।
  • OTHERS: অন্য যেকোনো ত্রুটি ঘটলে এটি ধরা পড়বে এবং ত্রুটির বার্তা প্রদর্শিত হবে।

Exception Handling এর মূল উপাদানসমূহ

  1. Predefined Exceptions: PL/SQL তে কিছু Predefined Exceptions আছে যা ডাটাবেস এবং PL/SQL প্রসেসে সাধারণ ত্রুটির জন্য ব্যবহার করা হয়। যেমন:
    • NO_DATA_FOUND: যখন SELECT ইনপুটে কোনো রেকর্ড না পাওয়া যায়।
    • TOO_MANY_ROWS: যখন SELECT ইনপুটে অনেক বেশি রেকর্ড পাওয়া যায়, যা একটিকে নির্বাচন করতে পারছে না।
    • ZERO_DIVIDE: যদি সংখ্যার ভাগফল শূন্যে ভাগ করা হয়।
    • INVALID_NUMBER: যখন একটি অকার্যকর সংখ্যার মান প্রদান করা হয়।
  2. User-Defined Exceptions: PL/SQL তে আপনি নিজেই exception তৈরি করতে পারেন, যা আপনার কোডের বিশেষ ত্রুটিগুলির জন্য ব্যবহৃত হবে। এর জন্য, প্রথমে exception ঘোষণা করতে হয়, এবং পরে RAISE কমান্ড দিয়ে এটি ব্যবহার করা হয়।

    User-defined Exception Declaration Example:

    DECLARE
       e_salary_exception EXCEPTION;
       v_salary NUMBER := -500;
    BEGIN
       IF v_salary < 0 THEN
          RAISE e_salary_exception;
       END IF;
    EXCEPTION
       WHEN e_salary_exception THEN
          DBMS_OUTPUT.PUT_LINE('Salary cannot be negative.');
    END;
    
  3. Handling Multiple Exceptions: PL/SQL তে একাধিক exception একটি EXCEPTION ব্লকে একসাথে পরিচালনা করা যেতে পারে। একাধিক exception পরস্পরকে প্রভাবিত না করে আলাদাভাবে ম্যানেজ করা যাবে।

    Example:

    BEGIN
       -- Some code
    EXCEPTION
       WHEN NO_DATA_FOUND THEN
          DBMS_OUTPUT.PUT_LINE('No data found');
       WHEN TOO_MANY_ROWS THEN
          DBMS_OUTPUT.PUT_LINE('Too many rows returned');
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('Other error: ' || SQLERRM);
    END;
    
  4. SQLERRM: এই বিল্ট-ইন ফাংশনটি আপনাকে ত্রুটির বার্তা প্রদান করে, যা exception ধরা হলে এর বিবরণ জানতে সাহায্য করে।

    Example:

    BEGIN
       -- Some operation that causes an error
    EXCEPTION
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('Error Message: ' || SQLERRM);
    END;
    
  5. RAISE_APPLICATION_ERROR: যখন আপনি নিজেই exception তৈরি করতে চান, তখন RAISE_APPLICATION_ERROR ব্যবহার করতে পারেন, যা একটি নির্দিষ্ট ত্রুটি কোড এবং বার্তা প্রদর্শন করবে।

    Example:

    BEGIN
       -- Some code
       RAISE_APPLICATION_ERROR(-20001, 'Custom error occurred');
    EXCEPTION
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
    END;
    

PL/SQL Exception Handling এর সুবিধা:

  1. Error Logging: Exception handling ব্যবহার করে, আপনি ত্রুটির বার্তা লগ করতে পারেন, যা ডিবাগিং এবং future maintenance এর জন্য উপকারী।
  2. Improved Code Flow: ত্রুটির কারণে প্রোগ্রাম বন্ধ না হয়ে তার পরবর্তী অংশ চালিয়ে যেতে পারে।
  3. User-Friendly Messages: ব্যবহারকারীকে ত্রুটি সম্পর্কে সঠিকভাবে জানানো, যেমন, invalid input বা ডাটাবেস সংক্রান্ত ত্রুটি।
  4. Program Control: একাধিক ত্রুটির জন্য বিশেষ কার্যাবলী নির্ধারণ করা সম্ভব হয়।

PL/SQL তে Exception Handling কোডের কার্যকারিতা এবং স্থিরতা নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ। এটি আপনাকে কোডের ত্রুটিগুলি ধরা এবং সঠিকভাবে পরিচালনা করার সুযোগ প্রদান করে, যার ফলে প্রোগ্রাম ত্রুটি ছাড়াই চলতে থাকে এবং ব্যবহারকারীকে সঠিক তথ্য প্রদান করা সম্ভব হয়।

Content added By

Predefined Exceptions: NO_DATA_FOUND, TOO_MANY_ROWS ইত্যাদি

141
141

PL/SQL এ Predefined Exceptions হলো কিছু নির্দিষ্ট ত্রুটি যা Oracle Database দ্বারা স্বয়ংক্রিয়ভাবে তৈরি এবং পরিচালিত হয়। এই exceptions গুলি সাধারণত এমন পরিস্থিতিতে ঘটে, যেগুলি সাধারণত ডেটাবেসের সাথে সম্পর্কিত বা SQL এর সাথে সম্পৃক্ত ত্রুটি। এগুলি handling করার জন্য আপনাকে EXCEPTION ব্লক ব্যবহার করতে হবে।

Oracle PL/SQL এ কিছু গুরুত্বপূর্ণ predefined exceptions এর মধ্যে অন্যতম হল NO_DATA_FOUND এবং TOO_MANY_ROWS


১. NO_DATA_FOUND Exception

NO_DATA_FOUND exception তখন ঘটে, যখন একটি SELECT INTO স্টেটমেন্ট কোনো রেকর্ড ফেরত না দেয়। এই exception সাধারণত ব্যবহৃত হয় যখন আমরা একক রেকর্ড পেতে আশা করি, কিন্তু কোন রেকর্ড পাওয়া যায় না।

উদাহরণ:

DECLARE
   v_employee_name VARCHAR2(100);
BEGIN
   -- Trying to fetch employee name by ID
   SELECT employee_name INTO v_employee_name
   FROM employees
   WHERE employee_id = 999;  -- Assume no employee with ID 999 exists

   DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No employee found with the given ID');
END;

এখানে, যদি employee_id = 999 এর জন্য কোনো রেকর্ড না থাকে, তবে NO_DATA_FOUND exception ঘটবে এবং No employee found with the given ID বার্তা প্রদর্শিত হবে।

NO_DATA_FOUND এর ব্যবহার:

  • এটি সাধারণত SELECT INTO স্টেটমেন্টে ব্যবহার করা হয় যখন একক রেকর্ডের জন্য ডেটা প্রত্যাশিত থাকে।
  • SELECT INTO এর মাধ্যমে যদি কোনো রেকর্ড না পাওয়া যায়, তাহলে এই exception সংঘটিত হয়।

২. TOO_MANY_ROWS Exception

TOO_MANY_ROWS exception তখন ঘটে, যখন একটি SELECT INTO স্টেটমেন্ট একাধিক রেকর্ড ফেরত দেয়, কিন্তু আপনি শুধু একক রেকর্ড আশা করেছিলেন। অর্থাৎ, যখন আপনার SELECT স্টেটমেন্ট একাধিক রেকর্ড রিটার্ন করে, তখন এটি একটি ত্রুটি তৈরি করে।

উদাহরণ:

DECLARE
   v_employee_name VARCHAR2(100);
BEGIN
   -- Trying to fetch employee name, but expecting only one employee with the same name
   SELECT employee_name INTO v_employee_name
   FROM employees
   WHERE employee_name = 'John Doe';  -- Assume more than one employee with this name

   DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
EXCEPTION
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('More than one employee found with the same name');
END;

এখানে, যদি employee_name = 'John Doe' এর জন্য একাধিক রেকর্ড থাকে, তবে TOO_MANY_ROWS exception ঘটবে এবং More than one employee found with the same name বার্তা প্রদর্শিত হবে।

TOO_MANY_ROWS এর ব্যবহার:

  • এটি সাধারণত SELECT INTO স্টেটমেন্টে ব্যবহার করা হয়, যখন আপনি একক রেকর্ডের প্রত্যাশা করেন কিন্তু SELECT স্টেটমেন্ট একাধিক রেকর্ড রিটার্ন করে।

৩. অন্যান্য Predefined Exceptions

Oracle PL/SQL এ আরও কিছু predefined exceptions রয়েছে, যেগুলি সাধারণ ডেটাবেস ত্রুটির সাথে সম্পর্কিত। যেমন:

৩.১. ZERO_DIVIDE:

এটি ঘটে যখন আপনি 0 দ্বারা ভাগ করার চেষ্টা করেন।

DECLARE
   v_result NUMBER;
BEGIN
   v_result := 10 / 0;  -- Division by zero
EXCEPTION
   WHEN ZERO_DIVIDE THEN
      DBMS_OUTPUT.PUT_LINE('Cannot divide by zero');
END;

৩.২. INVALID_CURSOR:

এটি ঘটে যখন আপনি একটি কুর্সর ব্যবহার করার চেষ্টা করেন যা খোলেনি বা ইতোমধ্যে বন্ধ হয়ে গেছে।

DECLARE
   cursor c1 is
      SELECT employee_name FROM employees;
BEGIN
   OPEN c1;
   FETCH c1 INTO v_employee_name;
   CLOSE c1;
   FETCH c1 INTO v_employee_name;  -- Trying to fetch after cursor is closed
EXCEPTION
   WHEN INVALID_CURSOR THEN
      DBMS_OUTPUT.PUT_LINE('Cursor is not open or already closed');
END;

৩.৩. DUP_VAL_ON_INDEX:

এটি তখন ঘটে, যখন একটি ইউনিক কনস্ট্রেইন্টের বিরুদ্ধে ডুপ্লিকেট ভ্যালু ইনসার্ট করার চেষ্টা করা হয়।

BEGIN
   INSERT INTO employees (employee_id, employee_name) 
   VALUES (1, 'John Doe');  -- Assume an employee with ID 1 already exists
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
      DBMS_OUTPUT.PUT_LINE('Duplicate value found for a unique index');
END;

Predefined Exceptions এর সুবিধা

  1. স্বয়ংক্রিয় ত্রুটি সনাক্তকরণ:
    • Oracle Database নিজেই কিছু সাধারণ ত্রুটি সনাক্ত এবং পরিচালনা করে, যা আপনাকে নিজে ত্রুটি পরিচালনা করতে সহায়ক হয়।
  2. সহজ ডিবাগিং এবং ত্রুটি হ্যান্ডলিং:
    • Predefined exceptions আপনাকে ত্রুটি ঘটার সাথে সাথে তা সনাক্ত এবং কার্যকরভাবে পরিচালনা করার জন্য একটি সহজ উপায় প্রদান করে।
  3. কোড ক্লিন এবং কমপ্যাক্ট:
    • এই exception গুলি ব্যবহার করার ফলে আপনার কোড কমপ্যাক্ট ও সহজ হয় এবং অনেক ত্রুটি সনাক্তকরণ অটোমেটিকভাবে হয়ে যায়।

উপসংহার:

PL/SQL এ Predefined Exceptions খুবই উপকারী কারণ এগুলি আপনাকে ডাটাবেস অপারেশন চলাকালীন সৃষ্ট ত্রুটিগুলি সহজে সনাক্ত এবং হ্যান্ডল করতে সহায়তা করে। এর মধ্যে NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE এবং আরও অনেক exception অন্তর্ভুক্ত রয়েছে, যেগুলি বিভিন্ন ধরনের ত্রুটি পরিস্থিতি মোকাবিলা করতে সক্ষম।

Content added By

User-defined Exceptions তৈরি এবং ব্যবহার

86
86

PL/SQL-এ User-defined Exceptions ব্যবহারকারী বা ডেভেলপার দ্বারা নির্দিষ্ট করা বিশেষ ধরণের ত্রুটি (error) যা প্রোগ্রামের নির্দিষ্ট অংশে ঘটে এবং তাকে যথাযথভাবে হ্যান্ডল করতে সাহায্য করে। PL/SQL তে পূর্বনির্ধারিত কিছু এক্সেপশন যেমন NO_DATA_FOUND, TOO_MANY_ROWS ইত্যাদি থাকে, কিন্তু যদি আপনার প্রোগ্রামে বিশেষ ধরণের ত্রুটি ঘটে যা পূর্বনির্ধারিত এক্সেপশন দ্বারা কভার করা হয়নি, তবে আপনি নিজে একটি User-defined Exception তৈরি করতে পারেন।

User-defined Exception এর প্রয়োজনীয়তা:

  • যখন পূর্বনির্ধারিত এক্সেপশন ব্যবহার করে সমস্যা সমাধান করা সম্ভব না হয়।
  • প্রোগ্রামের ব্যবসায়িক লজিকের জন্য একটি কাস্টম ত্রুটি বার্তা তৈরি করার প্রয়োজন হলে।
  • নির্দিষ্ট ধরণের ত্রুটি কন্ট্রোল করার জন্য প্রয়োজনে কাস্টম এক্সেপশন তৈরি করা।

User-defined Exception তৈরি এবং ব্যবহারের ধাপ:

  1. একটি এক্সেপশন ঘোষণা করা
  2. এটি ডিফাইন করা এবং এক্সেপশন হ্যান্ডলিং করা

১. একটি এক্সেপশন ঘোষণা করা

প্রথমে, আপনাকে এক্সেপশনটি ঘোষণা করতে হবে। PL/SQL-এ EXCEPTION ব্লকে এটি ডিক্লেয়ার করা হয়।

Syntax:

DECLARE
   exception_name EXCEPTION;  -- User-defined exception declaration
BEGIN
   -- code
EXCEPTION
   WHEN exception_name THEN
      -- exception handling code
END;

উদাহরণ:

DECLARE
   insufficient_balance EXCEPTION;  -- Declaring a user-defined exception
   v_balance NUMBER := 500;
BEGIN
   IF v_balance < 1000 THEN
      RAISE insufficient_balance;  -- Raise the exception if condition is met
   END IF;
EXCEPTION
   WHEN insufficient_balance THEN
      DBMS_OUTPUT.PUT_LINE('Insufficient balance! Please add more funds.');
END;

এখানে, insufficient_balance নামে একটি কাস্টম এক্সেপশন ঘোষণা করা হয়েছে। যদি v_balance ১০০০ এর নিচে থাকে, তবে এটি রেইজ (raise) করা হবে এবং একটি কাস্টম বার্তা প্রদর্শিত হবে।


২. এক্সেপশন রেইজ (RAISE) করা

একটি User-defined exception চালু করার জন্য RAISE স্টেটমেন্ট ব্যবহার করা হয়। এটি আপনাকে নির্দিষ্ট শর্ত পূর্ণ হলে এক্সেপশনটি তোলার (raise) সুযোগ দেয়।

Syntax:

RAISE exception_name;  -- RAISE keyword to trigger the exception

উদাহরণ:

DECLARE
   invalid_age EXCEPTION;
   v_age NUMBER := -5;
BEGIN
   IF v_age < 0 THEN
      RAISE invalid_age;  -- Raise exception when age is invalid
   END IF;
EXCEPTION
   WHEN invalid_age THEN
      DBMS_OUTPUT.PUT_LINE('Invalid age entered!');
END;

এখানে, invalid_age এক্সেপশনটি তখন রেইজ হবে যখন v_age এর মান নেতিবাচক (negative) হবে। এরপর EXCEPTION ব্লক এ গিয়ে "Invalid age entered!" বার্তা প্রিন্ট হবে।


৩. User-defined Exceptions Handling

একটি user-defined exception রেইজ করার পরে, আপনাকে সেই exception-টি যথাযথভাবে হ্যান্ডেল করতে হবে। হ্যান্ডলিং প্রক্রিয়াটি EXCEPTION ব্লকে ঘটে।

Syntax:

DECLARE
   exception_name EXCEPTION;
BEGIN
   -- Code that raises the exception
EXCEPTION
   WHEN exception_name THEN
      -- Code to handle the exception
END;

উদাহরণ:

DECLARE
   invalid_id EXCEPTION;  -- Declaring a user-defined exception
   v_emp_id NUMBER := 9999;
BEGIN
   IF v_emp_id NOT IN (SELECT employee_id FROM employees) THEN
      RAISE invalid_id;  -- Raise exception if employee ID doesn't exist
   END IF;
EXCEPTION
   WHEN invalid_id THEN
      DBMS_OUTPUT.PUT_LINE('Employee ID does not exist!');
END;

এখানে, invalid_id এক্সেপশনটি রেইজ হবে যদি কর্মচারী আইডি employees টেবিলের মধ্যে না থাকে। এরপর, EXCEPTION ব্লকের মাধ্যমে এই ত্রুটির জন্য একটি কাস্টম বার্তা প্রিন্ট করা হবে।


৪. RAISE_APPLICATION_ERROR ব্যবহার করা

RAISE_APPLICATION_ERROR ব্যবহার করে আপনি আরো নির্দিষ্ট ত্রুটি বার্তা তৈরি করতে পারেন। এই ফাংশনটি ব্যবহারকারীকে আরও বিস্তারিত ত্রুটি বার্তা প্রদান করতে সহায়তা করে।

Syntax:

RAISE_APPLICATION_ERROR(error_number, error_message);
  • error_number: একটি নেতিবাচক মান যা ত্রুটির কোড হিসেবে ব্যবহৃত হয়। এটি ২০০০০ থেকে ২০৯৯৯ পর্যন্ত হতে পারে।
  • error_message: একটি কাস্টম ত্রুটি বার্তা যা প্রদর্শিত হবে।

উদাহরণ:

DECLARE
   insufficient_funds EXCEPTION;
   v_balance NUMBER := 100;
BEGIN
   IF v_balance < 500 THEN
      RAISE_APPLICATION_ERROR(-20001, 'Insufficient funds! Your balance is too low.');
   END IF;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);  -- Display error message
END;

এখানে, যদি v_balance ৫০০ এর কম হয়, তবে RAISE_APPLICATION_ERROR ব্যবহার করে একটি কাস্টম ত্রুটি কোড এবং বার্তা রেইজ করা হবে। SQLERRM ব্যবহার করে এর ত্রুটি বার্তা প্রদর্শন করা হবে।


User-defined Exceptions এর সুবিধা:

  1. কাস্টম ত্রুটি বার্তা: আপনি নির্দিষ্ট কন্ডিশনে কাস্টম ত্রুটি বার্তা প্রদান করতে পারেন, যা ডেভেলপারের জন্য কোডের সমস্যা বুঝতে সহজ করে তোলে।
  2. প্রোগ্রাম লজিক: নির্দিষ্ট শর্তে কাস্টম এক্সেপশন ব্যবহার করে প্রোগ্রামের মধ্যে লজিক প্রয়োগ করা যায়।
  3. ভাল ত্রুটি হ্যান্ডলিং: যেহেতু আপনি নিজে ত্রুটি তৈরি ও হ্যান্ডেল করতে পারবেন, তাই আপনার প্রোগ্রাম ত্রুটি মোকাবেলায় আরও শক্তিশালী হবে।

Conclusion:

PL/SQL-এ User-defined Exceptions ব্যবহারকারীর প্রয়োজন অনুসারে কাস্টম ত্রুটি তৈরি করতে সহায়তা করে। এগুলি আপনি শর্তানুযায়ী প্রয়োগ করে প্রোগ্রামটি আরও নির্ভরযোগ্য এবং ব্যবহারযোগ্য করতে পারেন। এক্সেপশন রেইজ (RAISE) এবং RAISE_APPLICATION_ERROR এর মাধ্যমে নির্দিষ্ট ত্রুটির জন্য বার্তা প্রদান এবং তা হ্যান্ডল করা সম্ভব হয়, যা আপনার কোডে ত্রুটি মোকাবেলা করার সক্ষমতা বাড়ায়।

Content added By

RAISE এবং RAISE_APPLICATION_ERROR ব্যবহার

99
99

PL/SQL-এ RAISE এবং RAISE_APPLICATION_ERROR দুটি গুরুত্বপূর্ণ কমান্ড, যা এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এই কমান্ডগুলি কোডের চলাকালীন সময়ে কোন সমস্যা বা ত্রুটি ঘটলে ত্রুটির সূচনা করতে বা ব্যবহারকারীর জন্য কাস্টম ত্রুটি মেসেজ তৈরি করতে সাহায্য করে।


১. RAISE

RAISE কমান্ডটি সাধারণত exception ত্রুটি ফেলে দেয় এবং এই এক্সেপশনটি EXCEPTION ব্লকে ক্যাচ করা হয়। এটি একটি predefined বা user-defined exception হতে পারে। যখন RAISE ব্যবহার করা হয়, তখন তা ত্রুটি ছুঁড়ে দিয়ে ত্রুটি মেসেজের সাথে বা শুধুমাত্র exception নির্দিষ্ট করে কোড থামিয়ে দেয়।

RAISE এর Syntax:

RAISE [exception_name];
  • exception_name: এখানে আপনি যে এক্সেপশনটি তোলাতে চান সেটি উল্লেখ করবেন।

উদাহরণ:

DECLARE
   v_salary NUMBER := 5000;
BEGIN
   IF v_salary < 10000 THEN
      RAISE salary_too_low;
   END IF;
EXCEPTION
   WHEN salary_too_low THEN
      DBMS_OUTPUT.PUT_LINE('Salary is too low!');
END;

এখানে salary_too_low এক্সেপশনটি RAISE দ্বারা প্রবর্তিত হচ্ছে, এবং যদি বেতন ১০,০০০ টাকার নিচে থাকে, তাহলে এটি এক্সেপশনটিকে ক্যাচ করে এবং একটি মেসেজ প্রিন্ট করবে।


২. RAISE_APPLICATION_ERROR

RAISE_APPLICATION_ERROR কমান্ডটি ব্যবহারকারী-নির্ধারিত ত্রুটি মেসেজ তৈরি করার জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট ত্রুটি কোড এবং কাস্টম ত্রুটি মেসেজ সহ ত্রুটি প্রবর্তন করে। এই কমান্ডটি SQLCODE এবং SQLERRM এর মতো সিস্টেম ডিফাইনড এক্সেপশনগুলি ব্যবহার না করে, কাস্টম ত্রুটি কোড দিয়ে ত্রুটি মেসেজ তৈরি করতে সাহায্য করে।

RAISE_APPLICATION_ERROR সর্বদা ২০০০০ থেকে ২০৯৯৯ পর্যন্ত ত্রুটি কোড দিয়ে কাজ করে।

RAISE_APPLICATION_ERROR এর Syntax:

RAISE_APPLICATION_ERROR(error_number, error_message);
  • error_number: একটি ত্রুটি কোড (২০০০০ থেকে ২০৯৯৯ পর্যন্ত)।
  • error_message: ত্রুটির সবার উপরের কাস্টম মেসেজ।

উদাহরণ:

DECLARE
   v_salary NUMBER := 5000;
BEGIN
   IF v_salary < 10000 THEN
      RAISE_APPLICATION_ERROR(-20001, 'Salary must be at least 10,000!');
   END IF;
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

এখানে, যদি বেতন ১০,০০০ টাকার নিচে থাকে, তাহলে RAISE_APPLICATION_ERROR ব্যবহার করে কাস্টম ত্রুটি কোড (-20001) এবং মেসেজ 'Salary must be at least 10,000!' প্রদান করা হয়। EXCEPTION ব্লকটি ত্রুটি মেসেজ প্রিন্ট করবে।


RAISE এবং RAISE_APPLICATION_ERROR এর মধ্যে পার্থক্য

FeatureRAISERAISE_APPLICATION_ERROR
Purposeসাধারণ এক্সেপশন ছুঁড়ে দেওয়াকাস্টম ত্রুটি কোড এবং মেসেজ সহ এক্সেপশন তৈরি করা
Error Codeপূর্বনির্ধারিত (Predefined) এক্সেপশনকাস্টম কোড (20000 থেকে 20999 পর্যন্ত)
Error Messageপূর্বনির্ধারিত মেসেজকাস্টম ত্রুটি মেসেজ
Usageসাধারণ বা ব্যবহারকারী-নির্ধারিত এক্সেপশন সৃষ্টিতে ব্যবহারকাস্টম ত্রুটি কোড এবং মেসেজ তৈরি করতে ব্যবহার

কোন পরিস্থিতিতে কোনটি ব্যবহার করবেন?

  • RAISE: সাধারণ বা predefined এক্সেপশনগুলি ব্যবহার করার জন্য উপযুক্ত, যখন আপনি predefined exception ব্যবহার করে কোডের আউটপুট অথবা ফ্লো নিয়ন্ত্রণ করতে চান।
  • RAISE_APPLICATION_ERROR: যখন আপনি একটি নির্দিষ্ট ত্রুটি কোড এবং একটি কাস্টম মেসেজ ব্যবহার করে ত্রুটি পরিস্থিতি সৃষ্টিতে চান, তখন এটি ব্যবহার করা হয়। এটি ব্যবহারকারীর জন্য আরও স্পষ্ট এবং সহজবোধ্য ত্রুটি বার্তা তৈরি করতে সাহায্য করে।

শেষ কথা

RAISE এবং RAISE_APPLICATION_ERROR PL/SQL-এ শক্তিশালী টুল, যা এক্সেপশন হ্যান্ডলিং-এর মাধ্যমে কোডের নিরাপত্তা এবং কার্যকারিতা বৃদ্ধি করতে সাহায্য করে। RAISE সাধারণ এক্সেপশন ছুঁড়ে দিতে ব্যবহৃত হয়, আর RAISE_APPLICATION_ERROR কাস্টম ত্রুটি কোড এবং মেসেজ তৈরি করার জন্য ব্যবহৃত হয়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion