מדריך PL-SQL – טיפול בשגיאות

שגיאות ב-PL/SQL ניתנות לטיפול.
טיפול בשגיאות בא למנוע את קריסת המערכת במקרה של שגיאה, וקביעת קטע קוד שיתבצע אך ורק כאשר מתרחשת שגיאה (בדיוק באותו אופן שמתבמע הטיפול בשגיאות ב-C++ או Java).

ישנן שתי סוגי שגיאות (Exceptions)

  • שגיאות קבועות של המערכת
  • שגיאות הנקבעות ע"י המשתמש

שגיאות מערכת:

  • No-data-found – לא הוחזרו רשומות
  • Cursor-already-open – הסמן כבר פתוח, ולא ניתן לפותחו שוב
  • Dup-val-On-index – נסיון להכניס Index שכבר קיים
  • Storage-error – זכרון פגום
  • Program-error – שגיאה פנימית של PL/SQL
  • Zero-divide – נסיון חלוקה ב-0
  • invalid-cursor – נסיון לבצע פעולה או לסגור סמן שאינו פתוח
  • Login-denied – שם משתמש או סיסמא שגויים
  • Invalid-number – נסיון להכניס מחרוזת בשדה מסוג מספר
  • Too-many-rows – יותר מידי רשומות הוחזרו ע"י השאילתה (השגיאה תתרחש בדר"כ כאשר מנסים להציב תוצאת שאילתה בתוך משתנה יחיד, והשאילתה מחחזירה יותר מרשומה אחת).

אופן השימוש

begin
     --sequence of statements;
     exception
              when <exception_name> then
             --sequence of statements;
end;

דוגמאות

--When there is no data returned by row
declare
     price item.actualprice%type;
begin
     Select actual price into price from item where qty=888;
     exception
     when no-data-found then
     dbms_output.put_line('item missing');
end;
--EXAMPLE OF USER DEFINED EXCEPTION
DECLARE
      e_rec emp%ROWTYPE;
      e1 EXCEPTION;
      sal1 emp.sal%TYPE;
BEGIN
      SELECT sal INTO sal1 FROM emp WHERE deptno = 30 AND ename = 'John';
      IF sal1 < 5000 THEN
           RAISE e1;
          sal1 := 8500;
          UPDATE emp SET sal = sal1 WHERE deptno = 30 AND ename = 'John';
     END IF;
    
     EXCEPTION
           WHEN no_data_found THEN
            RAISE_APPLICATION_ERROR (-20001, 'John is not there.');
           WHEN e1 THEN
            RAISE_APPLICATION_ERROR (-20002, 'Less Salary.');
END;
/*EXAMPLE OF RAISE-APPLICATION-ERROR... 
  THIS IS YOUR OWN ERROR STATEMENT...
  U RAISE YOUR OWN ERROR*/

Declare
     s1 emp.sal %type;
begin
     select sal into s1 from emp where ename='SOMDUTT';
     if(no-data-found) then
          raise_application_error(20001, 'somdutt is not there');
     end if;
     if(s1 > 10000) then
          raise_application_error(20002, 'somdutt is earing a lot');
     end if;
     update emp set sal=sal+500 where ename='SOMDUTT';
end;
--INTERESTING EG OF USER DEFINED EXCEPTIONS
Declare
     zero-price exception;
     price number(8);
begin
     select actualprice into price from item where ordid =400;
     if price=0 or price is null then
          raise zero-price;
     end if;
     exception

              when zero-price then
          dbms_output.put_line('raised xero-price exception');
end; 

תגיות: , , , , , , ,

תגובות בפייסבוק