וובמאסטר - תיכנות ובניית אתרים

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

אלי לייבה/‏ 7 דצמבר, 2002
F+
F-
שגיאות ב-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; 
תגיות: SQL‏  /  PL_SQL‏  /  DB‏  /  Database‏  /  בסיס נתונים‏  /  oracle‏  /  אורקל‏  /  EXCEPTION‏  

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

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות