Oracle异常处理

来源:互联网 发布:淘宝如何引流推广 编辑:程序博客网 时间:2024/06/05 08:37
--异常处理
/*BEGIN
         sequence_of_statements;
EXCEPTION
          WHEN <exception_name> THEN
                      sequence_of_statements;
          WHEN OTHERS THEN
                       sequence_of_statements;
END;
*/


常用的函数和过程:
SQLCODE: 返回错误代码,没有错误时返回0
SQLERRM:返回错误消息.
PRAGMA EXCEPTION_INIT():把用户自定义异常与相应的错误代码关联,使用用户自定义异常来捕获、处理错误
RAISE_APPLICATION_ERROR:可用于定义用户错误消息和在使用该过程的位置上暂 停程序的执行。


异常的分类:
--1)系统预定义异常
  --根据部门编号查询员工信息
  select * from emp where deptno=100;
  
  declare
      v_ename emp.ename%type; 
      v_deptno emp.deptno%type:=&no;  --输入部门编号
  begin
    select ename into v_ename from emp where deptno=v_deptno;
     DBMS_OUTPUT.PUT_LINE(v_ename);
     --处理异常
     exception
       /* when NO_DATA_FOUND   then
           DBMS_OUTPUT.PUT_LINE('没有找到!'); */
         when TOO_MANY_ROWS   then
           DBMS_OUTPUT.PUT_LINE('返回多条数据!'); 
         WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm); 
     
  end;
  
  
select * from emp;
select * from dept;


--2)未预定义的异常  **
--实现修改编号为7788 的雇员所属的部门编号为99
  declare
      v_empno emp.empno%type:=&no;  --编号为7788  
        --声明异常
        ex exception;  --异常情况> EXCEPTION;
        --与标准的Oracle 错误联系起来,使用EXCEPTION_INIT 语句:
        pragma EXCEPTION_init(ex,-2291);   -- PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
  begin
    update emp set deptno=99 where empno=v_empno;
    
    --处理异常
     exception
       when ex then
         DBMS_OUTPUT.PUT_LINE('----->违反完整约束条件'); 
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);  
  end;


--3)自定义异常
DECLARE
name varchar(10);
ex EXCEPTION;   --(1)定义异常ex
BEGIN
SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';
DBMS_OUTPUT.PUT_LINE(name);
IF NAME<>'HR' THEN
RAISE ex;        --(2)触发异常
END IF;
--(3)处理异常
EXCEPTION
WHEN ex THEN
DBMS_OUTPUT.PUT_LINE('10号部门不是HR');  --处理异常
END;


--查询编号为7788 的雇员的福利补助(comm 列)


select * from emp where empno=7788;


declare
   v_comm emp.comm%type;
   
   --1)声明异常
   ex exception;
begin
    select comm into v_comm from emp where empno=7369;
    
    --判断
    if v_comm is null then
       raise ex;  --2)抛出异常
    end if;
    
   dbms_output.put_line(v_comm);
    
    --3)处理异常
     exception
       when ex then
          dbms_output.put_line('7788 的雇员无福利补助!');
         
end;


    
0 0