מדריך 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;

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