-->

14 March 2021

PL/SQL Exception

  Asp.Net CS By Example       14 March 2021
 PL/SQL Exception 

     PL/SQL Exception are used for handle the run-time errors in PL/SQL block.PL/SQL Exception are divided below category.
Sr.No Exception
1) System defined Exception
a) Named Exception
b) Un-Named Exception
2) User defined Exception


 1) System defined (Named Exception):-  

   These are Oracle defined exceptions, There are about 21 predefined exception, these are shown in below table.

Sr.No Exception Orale Code
1ZERO_DIVIDEORA-01476
2NO_DATA_FOUNDORA-01403
3TOO_MANY_ROWSORA-01422
4SUBSCRIPT_BEYOND_COUNT ORA-06533
5ACCESS_INTO_NULLORA-06530
6CASE_NOT_FOUNDORA-06592
7COLLECTION_IS_NULLORA-06531
8CURSOR_ALREADY_OPEN ORA-06511
9DUP_VAL_ON_INDEXORA-00001
10INVALID_CURSORORA-01001
11INVALID_NUMBERORA-01722
12LOGIN_DENIEDORA-01017
13NOT_LOGGED_ONORA-01012
14PROGRAM_ERRORORA-06501
15ROWTYPE_MISMATCHORA-06504
16SELF_IS_NULLORA-30625
17STORAGE_ERRORORA-06500
18SUBSCRIPT_OUTSIDE_LIMIT ORA-06532
19SYS_INVALID_ROWIDORA-01410
20TIMEOUT_ON_RESOURCEORA-00051
21VALUE_ERRORORA-06502




 Example:-


 1) No_data_found :-  
   This Exception is used to handle the program when query return no row.
Example 1:- Write a program to handle the Exception "no_data_found".

 Code  
declare
    vename emp.ename%type;
begin
    select ename into vename 
    from emp where empno=&empno;
    dbms_output.put_line(vename);
end;

 Result  
ERROR at line 1:
ORA-01403: no data found 
ORA-06512: at line 4

To handle this error we use exception "no_data_found" . Below is the example for same.
 Code  
declare
    vename emp.ename%type;
begin
    select ename into vename 
    from emp where empno=&empno;
    dbms_output.put_line(vename);
exception
        when no_data_found then
        dbms_output.put_line('No Data Found.'); 
end;

 2) Too_many_rows :-  
   This Exception is used to handle the program when query return more than one row.
Example2:-Write a program to handle the Exception "Too_many_rows".

 Code  
declare
    vename emp.ename%type;
begin
    select ename into vename 
    from emp 
    where deptno=&deptno;
    dbms_output.put_line(vename);
end;

 Result  
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4

To handle this error we can use "too_many_rows" Exception. Below is the example for same.
 Code  
declare
    vename emp.ename%type;
begin
    select ename into vename 
    from emp 
    where deptno=&deptno;
    dbms_output.put_line(vename);
exception
    when too_many_rows then
        dbms_output.put_line(
        'More than one employees 
        in given department number');
end;

Example3:-Write a program to handle the exception "no_data_found" and "too_many_rows".

 Code  
declare
    vename emp.ename%type;
begin
    select ename into vename 
    from emp 
    where deptno=&deptno;
    dbms_output.put_line(vename);
exception
    when too_many_rows then
    dbms_output.put_line(
    'More than one employees in 
    given department number');
when no_data_found then
    dbms_output.put_line(
    'No employees exist in
     given department number');
end;

 3) Invalid_cursor :-  
   This Exception is used to handle the cursor scope.
Example5:-Write a program to handle the Exception "Invalid_cursor".

 Code  
declare
    cursor c1 is select sal  from emp;
    vsal emp.sal%type;
begin
    loop
    fetch c1 into vsal;
        exit when c1%notfound;
        dbms_output.put_line(vsal);
    end loop;
    dbms_output.put_line(
    'Processed records:-'||c1%rowcount);
    close c1;
end;

 Result  
ERROR at line 1:
ORA-01001: invalid cursor
ORA-06512: at line 6

To handle this error we use exception "Invalid_cursor" . Below is the example for same.
 Code  
declare
    cursor c1 is select sal  from emp;
    vsal emp.sal%type;
begin
    loop
    fetch c1 into vsal;
        exit when c1%notfound;
        dbms_output.put_line(vsal);
    end loop;
    dbms_output.put_line('Processed 
    records:-'||c1%rowcount);
    close c1;
exception
    when invalid_cursor then
    dbms_output.put_line('Cursor 
    is not handled properly');
end;

 4) cursor_already_open :-  
   This Exception is used to handle the already open cursor .
Example5:-Write a program to handle the Exception "cursor_already_open".

 Code  
declare
    cursor c1 is select sal  from emp;
    vsal emp.sal%type;
begin
    open c1;
    loop
    open c1;
    fetch c1 into vsal;
        exit when c1%notfound;
        dbms_output.put_line(vsal);
    end loop;
        dbms_output.put_line(
        'Processed records:-'||c1%rowcount);
    close c1;
exception
when invalid_cursor then
    dbms_output.put_line(
    'Cursor is not handled properly');
end;

 Result  
ERROR at line 1:
ORA-06511: PL/SQL: cursor already open
ORA-06512: at line 2
ORA-06512: at line 7

To handle this error we use exception "cursor_already_open" . Below is the example for same.
 Code  
declare
    cursor c1 is select sal  from emp;
    vsal emp.sal%type;
begin
    open c1;
    loop
    open c1;
    fetch c1 into vsal;
        exit when c1%notfound;
        dbms_output.put_line(vsal);
    end loop;
    dbms_output.put_line(
    'Processed records:-'||c1%rowcount);
    close c1;
exception
when cursor_already_open then
    dbms_output.put_line(
    'You are trying to open cursor which 
    is already open');
end;

 5) invalid number :-  
   This Exception is used to handle the invalid number .
Example5:-Write a program to handle the Exception "invalid number".

 Code  
create table abc(
name varchar2(10),
sal number);
begin
    insert into abc 
    values('ABC','100');
end;
/
begin
    insert into abc 
    values('XYZ','xyz');
end;
/

 Result  
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 2

To handle this error we use exception "cursor_already_open" . Below is the example for same.
 Code  
begin
    insert into abc 
    values('XYZ','xyz');
exception
when invalid_number then
    dbms_output.put_line(
    'You are using invaid datatyes');
end;

 6) value error :-  
   This Exception is used to handle the value error .
Example5:-Write a program to handle the Exception "value error".

 Code  
declare
    tot number;
begin
    tot:='&a'+'&b';
    dbms_output.put_line(tot);
end;

 Result  
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 4

To handle this error we use exception "value error" . Below is the example for same.
 Code  
declare
    tot number;
begin
    tot:='&a'+'&b';
    dbms_output.put_line(tot);
exception
when value_error then
    dbms_output.put_line(
    'please use correct data' );
end;

 User defined exception :-  
   We can declare our own exception and can raise in anywhere in program.When user defined exception raised then exception block called to see the definition of that exception.

 Code  
declare
    a exception;
    vsal emp.sal%type;
begin
    select sal into vsal 
    from emp where empno=&empno;
    if vsal>3000 then
        raise a;
    else
        dbms_output.put_line(vsal);
    end if;
exception
when a then
    dbms_output.put_line(
    'Salary is too high');
end;

Below is the another example for same.
 Code  
declare
    a1 exception;
    a2 exception;
    a3 exception;
    a4 exception;
begin
    begin
        raise a1;
    exception
    when a1 then
        dbms_output.put_line(
        'Exception a1 handled');
        raise a3;
    end;
exception
when a2 then
    dbms_output.put_line(
    'Exception a2 handled');
when a3 then
    dbms_output.put_line(
    'Exception a3 handled');
when a4 then
    dbms_output.put_line(
    'Exception a4 handled');
end;

 Error Trapping Functions :-  
  In pl-sql when run time exception occer then we want to known what kind of error details and error line. To get this details we can we use 'SQLCODE' and 'SQLERRM'.
Sr.No Keyword Description
1) SQLCODE It returns number
2) SQLERRM It return Error message

 Code  
declare
   name emp.ename%type;
begin
    select ename into name 
    from emp where empno=&eno;
exception
 when no_data_found then 
    dbms_output.put_line(
    'SQLCODE: '|| SQLCODE);
    dbms_output.put_line(
    'SQLERRM: '|| SQLERRM);
end;

Below is the another example for same.
 Code  
declare
      cursor c1 is select ename from emp;
      vename emp.ename%type;
      n number;
begin
     open c1;
        loop
           fetch c1 into vename;
           dbms_output.put_line(vename);
           exit when c1%notfound;
        end loop;
    close c1;
      n:=c1%rowcount;
exception
     when invalid_cursor then
    dbms_output.put_line('SQLCODE: '|| SQLCODE);
    dbms_output.put_line('SQLERRM: '|| SQLERRM);
end;

 Raise Application Error :-  
  If you want to display your own user defined exception code and exception message then we can use raise_application_error procedure.
 Syntax  
raise_application_error(error_number,error_message);

Sr.No Parameter Description
1) error_number it should be between -20000 and -20999.
2) error_message It should upto maximum 512 characters.

example for same.
 Code  
declare
    a exception;
    vsal emp.sal%type;
begin
    select sal into vsal 
    from emp where empno=&empno;
    if vsal>3000 then
        raise a;
    else
        dbms_output.put_line(vsal);
    end if;
exception
when a then
    raise_application_error(
    -20102,'Salary is too high');
end;
logoblog

Thanks for reading PL/SQL Exception

Previous
« Prev Post

No comments:

Post a Comment

Please do not enter any spam link in the comment box.