iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle专题13之异常错误处理
  • 470
分享到

Oracle专题13之异常错误处理

2024-04-02 19:04:59 470人浏览 薄情痞子
摘要

1、异常处理的概念与分类 a、什么是异常? 异常:是程序在正常执行过程中发生的未预料的事件。 b、什么是异常处理? 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现

1、异常处理的概念与分类

a、什么是异常?

  • 异常:是程序在正常执行过程中发生的未预料的事件。

    b、什么是异常处理?

  • 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现的各种错误,使得程序正常运行。

    c、异常处理的语法格式

    EXCEPTioN 
    WHEN first_exception THEN 
        statement1;
        ......
    WHEN second_exception THEN 
        statement1;
        ......
    WHEN OTHERS THEN
        statement1;
        ......

    d、异常处理代码的PL/sql块中的位置

    DECLARE
        
    BEGIN
        
    EXCEPTION
     
     END; --块结束标记
  • 简单示例代码:查询指定部门的所有员工姓名和工资。
    DECLARE
        v_name emp.ename%TYPE;
        v_sal emp.sal%TYPE;
    BEGIN
        SELECT ename, sal INTO v_name, v_sal FROM emp  WHERE empno = &no;
        IF v_sal < 3000 THEN 
            dbms_output.put_line(v_name || '的工资是:' || v_sal);
            END IF;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            dbms_output.put_line('员工号输入错误!');
        WHEN OTHERS THEN 
            dbms_output.put_line('其他错误!');
    END;

    e、异常的分类

  • 预定义异常、非预定义异常和自定义异常

    2、预定义异常

  • 预定义异常是指由PL/SQL所提供的系统异常,oracle提供了20多个预定义异常,每个预定义异常对应一个特定的Oracle错误,当PL/SQL块出现这些Oracle错误时,会隐含地触发相应的预定义异常。
    Oracle专题13之异常错误处理
  • 对于预定义异常情况的处理,无需在程序中定义,只需要在PL/SQL块中的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
  • 示例代码:根据输入的工资,查询员工的姓名。并输出员工的姓名以及工资。
        DECLARE
            v_name emp.ename%TYPE;
            v_sal emp.sal%TYPE := &salary;
        BEGIN
            SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
            DBMS_OUTPUT.put_line(v_name || '的工资是:' || v_sal);
        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('其他错误');
        END;

    3、非预定义异常

  • 用于处理预定义异常所不能够处理的ORACLE错误,此种异常需要在程序中定义。

    a、非预定义异常的处理包括3步

    1、在PL/SQL块中定义部分定义异常情况:<异常情况> EXCEPTION;
    2、将其定义好的异常情况与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT语句:PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
    3、在PL/SQL块的异常情况处理部分对异常情况做出相应的处理。

    b、代码演示

  • 删除dept表中指定部分的信息。(删除部门时应该保证指定部门中没有员工,因为dept和emp表存在主外键关系)
    1、当删除有其员工的部门时,获取错误号:
    BEGIN
        DELETE FROM dept WHERE deptno = &deptno;
    EXCEPTION
        WHEN OTHERS THEN
            dbms_output.put_line(SQLCODE || '###' || SQLERRM);
    END;
  • 当按F8执行,键入20后,控制台打印如下内容:
    -2292###ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录

    2、删除dept表中指定部分的信息:

    DECLARE
        --1、定义非预定义异常的标识符
        e_fk EXCEPTION;
        --2、把Oracle错误和异常信息建立关联
        -- -2292 违反外键约束的错误号
        PRAGMA EXCEPTION_INIT(e_fk, -2292);
    BEGIN
        DELETE FROM dept WHERE deptno = &deptno;
    EXCEPTION
        WHEN e_fk THEN
            -- 3、捕捉并处理异常
            dbms_output.put_line('此部门下有员工,不能删除!');
        WHEN OTHERS THEN
            dbms_output.put_line(SQLCODE || '###' || SQLERRM);
    END;   
  • 当按下F8执行,键入20后,控制台打印如下内容:
    此部门下有员工,不能删除!

    4、自定义异常

  • 如果你想在某个特定事件发生时向应用程序的用户发出一些警告信息。而事件本身不会抛出Oracle内部异常,这个异常是属于应用程序的特定异常。那么就需要自定义异常。
  • 用户定义的异常错误时通过显式使用RaiSE语句来触发的。当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码。

    a、自定义异常的处理步骤

  • 对于这类异常情况的处理,步骤如下:
    1、在PL/SQL块的声明部分定义异常情况:<异常情况> EXCEPTION;
    2、RAISE <异常情况>
    3、在PL/SQL块的异常处理部分对异常情况做出相应的处理。

    b、示例代码

  • 更新指定员工编号的员工工资:
    DECLARE
        v_empno emp.empno%TYPE := &empno;
        e_no_result EXCEPTION;
    BEGIN
        UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
        IF SQL%NOTFOUND THEN
            RAISE e_no_result;
        ELSE
            COMMIT;
        END IF;
    EXCEPTION
        WHEN e_no_result THEN
            dbms_output.put_line('数据更新失败!');
        WHEN OTHERS THEN 
            dbms_output.put_line('其他错误');
    END;

    5、SQLCODE和SQLERRM

    a、异常处理函数

  • 异常处理函数用于取得Oracle错误号和错误信息,其中函数SQLCODE用于取得错误号,SQLERRM用于取得错误信息。
  • 当编写PL/SQL块时,通过在异常处理部分引用函数SQLCODE和SQLERRM,可以取得未预计到的Oracle错误。
  • 另外,通过使用内置过程RAISE_APPLICATION_ERROR,可以在建立子程序(过程、函数、包)时自定义错误号和错误信息。

    b、异常处理函数示例代码

  • 插入员工信息(包括员工号、员工名和员工所属部门号):
    DECLARE
        v_empno emp.empno%TYPE := &empno;
        v_ename emp.ename%TYPE := '&ename';
        v_deptno emp.deptno%TYPE := &deptno;
    BEGIN
        INSERT INTO emp(empno, ename, deptno) VALUES(v_empno, v_ename, v_deptno);
        IF SQL%FOUND THEN
            DBMS_OUTPUT.put_line('数据插入成功');
            COMMIT; 
        END IF;
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.put_line('错误号:' || SQLCODE);
            DBMS_OUTPUT.put_line('错误信息:' || SQLERRM);
    END;  

    c、RAISE_APPLICATION_ERROR

  • 该过程用于在PL/SQL子程序中自定义错误信息。
  • 语法格式为:
    raise_application_error(error_number, message);
  • error_number:用于定义错误号(-20000~-20999)。
  • message:用于指定错误信息,长度不能超过2048个字节。
您可能感兴趣的文档:

--结束END--

本文标题: Oracle专题13之异常错误处理

本文链接: https://www.lsjlt.com/news/39045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-15
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-15
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-15
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-15
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-15
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-15
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-15
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-15
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作