Oracle数据库的应用,初识PLSQL-3

155 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

8.1 预定义异常

DECLARE

BEGIN

......

EXCEPTION

        WHEN 异常名称 THEN

             --异常处理语句

--异常可使用SQLCODE输出错误编码,以及使用SQLERRM来输出错误信息:

dbms_output.put_line('值类型错误' || SQLCODE || SQLERRM);

        WHEN 异常名称 THEN

             异常处理语句

        ………

       WHEN OTHERS THEN

             异常处理语句

所有异常种类:

  • ACCESS_INTO_NULL  在未初始化对象时出现
  • CASE_NOT_FOUNF   在CASE语句中的选项与用户输入的数据不匹配时出现
  • COLLECTION_IS_NULL 在给尚未初始化的表或数组赋值时出现
  • CURSOR_ALREADY_OPEN 用户试图重新打开已经打开的游标时出现。在重新打开游标前必须先将其关闭
  • INVALID_CURSOR 在执行非法游标运算(如fetch一个尚未打开的游标)时出现
  • LOGIN_DENIED 输入的用户名或密码无效时出现
  • SOTRAGE_ERROR 在内存损坏或PL/SQL耗尽内存时出现
  • DUP_VAL_ON_INDEX 用户试图将重复的(duplicate)值存储在使用唯一索引的数据库列中时出现(insert into student (id) values(1) 1为已存在的id)
  • INVALID_NUMBER 将字符串转换为数字时出现(select id into i from student where name = 3)
  • NO_DATA_FOUND 在表中不存在请求的行时出现(select id into i  from student where id = -1)
  • TOO_MANY_ROWS 在执行SELECT INTO语句后返回多行时出现(select id into i  from student)
  • VALUE_ERROR 变量中的列值超出变量的大小或类型(i number(1); i:='a';)
  • ZERO_DIVIDE 以零做除数时出现(i number; i:=1/0)

示例:

DECLARE

i number;

str varchar2(10) := '1';

BEGIN

  select id into i from student;

EXCEPTION

        WHEN VALUE_ERROR THEN

             dbms_output.put_line('值类型错误' || SQLCODE || SQLERRM);

        WHEN ZERO_DIVIDE THEN

             dbms_output.put_line('0不能做被除数' || SQLCODE || SQLERRM);

        WHEN TOO_MANY_ROWS THEN

             dbms_output.put_line('返回了太多行,i只能接收一个' || SQLCODE || SQLERRM);

        WHEN NO_DATA_FOUND THEN

             dbms_output.put_line('没有返回行,i无法完成赋值' || SQLCODE || SQLERRM);   

        WHEN  ACCESS_INTO_NULL THEN

             dbms_output.put_line('变量没有初始化' || SQLCODE || SQLERRM);

         WHEN  INVALID_NUMBER THEN

             dbms_output.put_line('数字不能转为字符串' || SQLCODE || SQLERRM);  

                  

       WHEN  DUP_VAL_ON_INDEX THEN

             dbms_output.put_line('索引重复' || SQLCODE || SQLERRM);

     WHEN OTHERS THEN

          dbms_output.put_line('未知错误' || SQLCODE || SQLERRM);      

END;

8.1.1 非预定义异常 (自定义异常)

Oracle允许自定义的错误代码的范围为-20000 -- -20999

示例1:

DECLARE

BEGIN

         RAISE_APPLICATION_ERROR(-20001,'I am sorry to see you');

EXCEPTION

          WHEN OTHERS THEN

          dbms_output.put_line( SQLCODE ||'      '|| SQLERRM);    

END;

示例2:

DECLARE

myexception exception;

BEGIN

RAISE myException;

EXCEPTION

         WHEN myexception THEN

                RAISE_APPLICATION_ERROR(-20001,'I am sorry to see you');

END;