מדריך 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;
תגובות בפייסבוק