Oracle 学习笔记第九天

Oracle 学习笔记第九天

异常

​ 概念:在运行程序时出现的错误叫做异常

​ 发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分。

​ 分类:

  		1. 预定义异常
-- 语法:
BEGIN
         sequence_of_statements;
EXCEPTION
          WHEN <exception_name> THEN
                      sequence_of_statements;
          WHEN OTHERS THEN
                       sequence_of_statements;
END;
-- 举例:
BEGIN
  update teacher t set t.comm=100/0;
EXCEPTION
    WHEN ZERO_DIVIDE THEN                   				dbms_output.put_line('除数为0');
     WHEN OTHERS THEN                  						dbms_output.put_line('其他异常');
END;
  1. 用户定义异常

    有些情况可能是正常运行,但是在需求上需要我们将其设为异常,这时候就需要用到自定义异常了。

    比如说有些时候我们查询的值符合规范,但是在数据库中没有值,这时候返回给我们的为空(不为null,为‘ ’),但是这时候却不想显示空,可以写一个自定义异常,显示一些我们想要输出的提示内容。

    首先我们需要在声明部分定义异常,然后在异常块里面抛出异常,然后在处理异常。

    -- 语法
    -- 声明异常
    	DACLARE
    		e_exceptionName EXCEPTION;
    -- 抛出异常
    	BEGIN
    		RAISE e_exceptionName ;
    -- 处理异常
    	-- 这部分写你想要怎么处理的逻辑。
    

    用户自定义异常

    绑定异常编号

    我们通过PLSQL运行后爆出的异常一般可以看到异常编码,但是我们不知道用什么名称将有些特殊的系统异常放在异常处理中,这个时候我们可以定义异常,然后绑定异常编号,通过这样来达到处理这些异常的目的,比如:

    异常编号

前面的ORA-xxxxx就是异常编码,定义异常变量,然后绑定这个异常编码,再在异常处理中处理。

-- 语法:
declare
    --定义异常变量
    v_exception exception;
    --将异常变量绑定到某个特殊的错误码
    pragma exception_init(v_exception,-2291);
-- 举例:
set serveroutput on;
declare
    v_empno emp.empno%type := &工号;
    --定义异常变量
    v_exception exception;
    --将异常变量绑定到某个特殊的错误码
    pragma exception_init(v_exception,-2291);
begin
    update emp e 
    set e.deptno = 99
    where e.empno = v_empno;  
exception
    when  v_exception then
       dbms_output.put_line('新的部门编号在部门表中不存在');   
end;
/

抛出异常

和java一样,异常我们可以处理,也可以抛出,同样,抛出的异常有上一级调用者处理。

-- 语法
-- 在begin中判断后
raise_application_error(自己定义的异常编号,自己定义的输出的异常信息);
set serveroutput on;
declare
    v_deptno emp.deptno%type := &部门编号;
    v_sum number(10,2);    
begin
    select sum(e.sal) into v_sum
    from emp e
    where e.deptno = v_deptno;
    --如果总工资为空则抛异常
    if v_sum is null then 
        --抛出异常
        raise_application_error(-20001,'你输入的部门没有员工');
    end if;
    dbms_output.put_line('该部门的总工资为:'||v_sum);
end;
/

Oracle自定义的错误码是有取值范围的,貌似小于20000的值不能选,这个是Oracle系统用的,具体还是得看官方文档,暂时还没搞清是多少。

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85218171