PL/SQL中自定义异常小知识

一、概念

用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。

对于这类异常情况的处理,步骤如下 :

  • 在PL/SQL 块的声明部分定义异常情况 :<异常情况>  EXCEPTION;
  • RAISE <异常情况>
  • 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

二、程序

--例1:使用自定义异常变量

DECLARE
   v_empno emp.empno%TYPE :=&empno;
   no_result  EXCEPTION;--定义异常变量
BEGIN
   UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
   IF SQL%NOTFOUND THEN
      RAISE no_result;
   END IF;
EXCEPTION
   WHEN no_result THEN
      DBMS_OUTPUT.PUT_LINE(‘你的数据更新语句失败了!‘);
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE ||’---‘|| SQLERRM);
END;

--例2:使用RAISE_APPLICATION_ERROR函数抛出异常

DECLARE
    v_deptid departments.department_id%TYPE := &no;
    v_dname  departments.department_name%TYPE;
BEGIN
    SELECT department_name
      INTO v_dname
      FROM departments
     WHERE department_id = v_deptid;
    dbms_output.put_line(v_dname);
EXCEPTION
    WHEN OTHERS THEN
        raise_application_error(-20001,
                                ‘department‘ || v_deptid ||
                                ‘does not exists‘);
END;

注意:

  1. 用户自定义的异常,异常编号从 -20001开始。
  2. 某给定异常最多由异常处理部分的一个处理器进行处理。如果有多个异常处理器,则PL/SQL编   译器产生PLS-00483错误。
  3. QLCODE返回当前错误代码,SQLERRM返回当前错误的消息文本。对于用户自定义异常SQLCODE返回值为‘1’,SQLERRM返回值为‘User-defined Exception’。
  4. Oracle错误信息的最大长度是512字节。
  5. SQLCODE和SQLERRM的值先赋给本地变量,不能直接用于SQL语句。

三、异常执行机制

  1. 如果当前块对该异常错误设置了处理,则执行它并成功完成该块的执行,然后控制转给包含块。
  2. 如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。然后对该包含块执行步骤1。


四、在PL/SQL中如何输出异常发生的行号及异常代码

    只需在异常块中加入下列代码即可。

EXCEPTION
     WHEN OTHERS THEN
        dbms_output.put_line( SQLERRM || ‘-‘ || dbms_utility.format_error_backtrace);

				
时间: 2024-10-11 18:03:49

PL/SQL中自定义异常小知识的相关文章

ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL

3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3.1.1变量初始化时使用select into语法 select A INTO V_A INSERT INTO xxx(表)( XA)values (V_A) 3.1.2 在pl/sql语句块中使用DML a.使用oracle序列 CURR b.获取和递增序列值 CURRVAL 返回序列的当前值 NE

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000

在PL/SQL中调用存储过程--oracle

在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int, sExeTime in varchar2 ) is begin Insert into T_TEST(C_ID, C_NAME, C_AGE, C_INTIME, C_EXETIME) values(T_TEST_CID.nextval,sName,sAge, sysdate, to_date(sExe

在PL/SQL中使用日期类型

之前的文章介绍了在PL/SQL中使用字符串和数字了下.毫无疑问,字符串和数字很重要,但是可以确定的是没有哪个应用不依赖于日期的. 你需要记录事件的发生事件,人们的出生日期等等很多. 通常的使用方式是: 1)声明日期变量和常量 2)使用内建函数显示和修改日期值 3)执行日期相关计算 日期类型比字符串或数字更复杂.它有多个部分组成(年,月,日,时,分,秒等),而且关于一个有效的日期有很多规则. 本文将给你所有信息以便在PL/SQL程序中使用日期. 1.PL/SQL中的日期,时间戳和间隔(Interv

PL/SQL中如何让程序每隔几秒插入一条数据

在编写ORACLE PL/SQL中,如果需要程序执行中暂停几秒钟再继续执行,可以通过oracle内置的dbms_lock.sleep来实现,不过dbms_lock包需要用户自己安装. [[email protected] ~]# su - oracle [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon May 25 16:36:12 2015 Copyright (c

PL/SQL中的游标

游标 :是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情. 定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句 ,     其    一般形式为:   CURSOR cursor_name IS  select_statement; 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合.OPEN cursor_name: 提取游标:就是检索结果集

PL/SQL(五)PL/SQL中动态执行SQL语句

在PL/SQL程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能直接在PL/SQL中执行.这些语句可以使用动态SQL来实现. PL/SQL块先编译然后再执行,动态SQL语句在编译时不能确定,只有在程序执行时把SQL语句作为字符串的形式由动态SQL命令来执行.在编译阶段SQL语句作为字符串存在,程序不会对字符串中的内容进行编译,在运行阶段再对字符串中的SQL语句进行编译和执行,动态SQL的语法是: 语法格式:动态SQL EXECUTE IMMEDIATE 动态语句

PL/SQL中SELECT总结

一.SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用 5.HAVING 6.ORDER BY 举个例子如下: select item_name,count(item_name) from lab_item_dict where price='25' group by item_name having count(item_name)>1 order by cou

PL/SQL中LOOP循环控制语句

在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LOOP语句的基本语法结构如下: [<<label_name>>] LOOP statement... END LOOP [label_name] [语法说明] <<label_name>>:LOOP结构的标签,是可选项. LOOP:LOOP循环开始标志. stat