/** 异常处理 一个PL/SQL 程序的错误可以分为两种,编译时刻错误和运行时刻有错误 1, 编译时刻错误,一般为语法级别的错误,例如标点,结构体缺失关键字 if then end if; 缺失“;” 等等; 2,运行时刻错误(异常错误) 运行异常,PL/SQL(一个函数,一个过程)在运行过程中出现的,比如select into返回多列; 类似Java的异常处理机制,PL/SQL块中捕获和处理异常是由异常处理部分来完成的 语法: EXCEPTION WHEN 异常错误名称1 [ OR 异常错误名称2 .......] THEN -- 可以把多个异常做统一处理 语句段; WHEN 异常错误名称3 [ OR 异常错误名称4......] THEN 语句段; WHEN OTHERS THEN -- 最底层的父异常 (相当于JAVA中的java.lang.Exception),捕获所有可能遇到的异常 语句段; END; */ DECLARE v_title tb_news.title%TYPE; BEGIN SELECT title INTO v_title FROM tb_news WHERE ID = &news_id; EXCEPTION WHEN NO_DATA_FOUND THEN -- 如果没找到,捕获异常 DBMS_OUTPUT.PUT_LINE( '没有找到数据,捕获异常' ); WHEN OTHERS THEN -- 如果还有可能遇到其他不确定的异常 DBMS_OUTPUT.PUT_LINE( '如果还有可能遇到其他不确定的异常' ); END; / /** 3,异常种类 3.1 异常可以分为预定义异常(Oracle自定义的,大约20个) 比如NO_DATA_FOUND(select into时没找到数据, DUP_VAL_ON_INDEX (insert 时违反不能重复的约束) ,tb_user_friend中的组合主键约束 */ DECLARE v_user_friend tb_user_friend%ROWTYPE; BEGIN INSERT INTO tb_user_Friend VALUES ('60110106','30742920'); INSERT INTO tb_user_Friend VALUES ('60110106','30742920'); EXCEPTION WHEN nup_val_on_index THEN DBMS_OUTPUT.PUT_LINE( '违反组合主键约束' ); END; / DECLARE v_title tb_novel.title%TYPE; BEGIN SELECT title INTO v_title FROM tb_novel WHERE typeid = &menuid; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE( '返回多行数据' ); END; / /** 3.2 非预定义异常 在声明部分(DECLARE) ,用EXCEPTION_INIT()编译指令建立该异常错误名称与某个Oracle错误之间的联系。因此当该Oracle错误发生时候,就能够自动引发该异常错误了,而不需要 RAISE语句来引发 语法 PARGMA EXCEPTION_INIT(Exception_name,oracle_error_code) 其中,Exception_name是定义的异常错误的名称,Oracle_error_code是Oracle的错误代码 */ DECLARE e_null_error EXCEPTION; PRAGMA EXCEPTION_INIT(e_null_error,-1400); BEGIN INSERT INTO tb_novel VALUES (); EXCEPTION WHEN e_null_error THEN DBMS_OUTPUT.PUT_LINE( 'typeid 列不能为null' ); END; / /** 3.3 自定义异常 自定义异常是指由PL/SQL 程序员定义的异常。它并不一定是个错误,而是程序员根据编程和调试需要而为特殊情况所定义的异常 自定义异常必须要声明,并且必须要用raise语句显示地引发 */ DECLARE v_self_error EXCEPTION; BEGIN IF 1 = 1 THEN RAISE v_self_error; END IF; EXCEPTION WHEN v_self_error THEN DBMS_OUTPUT.PUT_LINE( '自定义异常' ); END; /