• 使用例外



    例外(exception)是一种pl/sql标示符,他用于处理pl/sql程序的运行错误。为了提高pl/sql程序的健壮性,开发人员必须要考虑pl/sql程序可能出现的各种错误,并编写相应的例外处理部分。如果不进行错误处理,那么在出现运行错误时,会终止pl/sql程序的运行,并显示错误信息。

    例子:


    declare
    v_ename emp.ename%type;
    begin
    select ename into v_ename from emp where empno=&no;
    dbms_output.put_line('雇员名:'||v_ename);
    end;
    /

    输入no的值:1111
    ORA-01403: 未找到任何数据


    处理预定义例外

     NO_DATA_FOUND   :该例外对应于ora-01403错误。当执行select into 未返回行,或者引用未初始化的pl/sql表元素时,会隐含的触发该例外。

    TOO_MANY_ROW     : 该例外对应于ora-01422错误。当执行select into语句时,如果返回超过一行,则会触发该例外。

    DUP_VAL_ON_INDEX:该例外对应于ora-00001错误。当唯一索引所对应的列上键入重复值时,会隐含的触发该例外。

    ZERO_DIVIDE           :该例外对应于ora-10476错误。当运行pl/sql块是,如果使用数字值除0,则会隐含的触发该例外。

    INVALID_CURSOR     :该例外对应于ora_01001错误。当试图在不合法的游标上执行操作时,会隐含的触发该例外。


    例子:

    declare 
    v_ename emp.ename%type;
    begin
    select ename into v_ename from emp where empno=&no;
    dbms_output.put_line('雇员名:'||v_ename);
    exception
    when no_data_found then
    dbms_output.put_line('该雇员不存在');
    end;
    /

    输入no的值:1234

    该雇员不存在

    处理非预定义例外

    非预定义例外用于于预定义例外无关的oracle错误。当使用预定义例外时,只能处理21个oracle错误。为了处理其他oracle错误,必须使用非预定义例外。使用非预定义例外的步骤 定义例外——关联例外和错误——引用例外

    例子:

    declare 
    e_integrity exception;
    pragma exception_init(e_integrity,-2291);
    begin
    update emp set deptno=&dno where empno=&eno;
    exception
    when e_integrity then 
    dbms_output.put_line('该部门不存在');
    end;
    /


    输入dno的值:15 

    输入eno 的值:7782

    该部门不存在

    因为dept表和emp表之间具有主外键关系,所以当修改雇员名的部门号时,部门号必须在dept表中存在。如果该部门不存在,则会隐含触发ora-02291对应的例外e_integrity,并显示合理的输出信息。


    处理自定义例外

    自定义例外是指pl/sql开发人员所定义的例外。预定义和非预定义例外都与oracle错误有关,并且当出现oracle错误时会隐含触发相应例外;而自定义例外与oracle错误没有任何关联,他是由开发人员为特定情况所定义的例外。步骤:定义例外——显式触发例外——引用例外

    例子:

    eclare
    e_integrity exception;
    pragma exception_init(e_integrity,-2291);
    e_no_employee exception;
    begin
    update emp set deptno=&dno where empno=&eno;
    if sql%notfound then
    raise e_no_employee;
    end if;
    exception
    when e_integrity then 
    dbms_output.put_line('该部门不存在');
    when e_no_employee then 
    dbms_output.put_line('该雇员不存在');
    end;
    /

    输入dno的值:10

    输入eno的值:1234

    该雇员不存在


    -------------------------------------------

    作者:赵杰迪

    -------------------------------------------

  • 相关阅读:
    C#&.Net干货分享-构造QRCoderHelper生成二维码图片
    C#&.Net干货分享- 构造BaiduLanguageHelper对接百度的语言翻译
    C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等
    C#后台架构师成长之路-Orm篇体系
    C#后台架构师成长之路-进阶体系篇章大纲
    C#后台架构师成长之路-基础体系篇章大纲
    统一删除SQL Server某一个数据库内批量表数据
    SQL Server 创建链接服务器的脚本,自定义链路服务器的简短名称
    SQL SERVER查询数据库所有表的大小,按照记录数降序排列
    一键删除数据库所有的外键约束-FOREIGN_KEYS
  • 原文地址:https://www.cnblogs.com/zhaojiedi1992/p/oracle11g_sql_0015.html
Copyright © 2020-2023  润新知