PLSQL编程之异常

捕捉异常,并进行处理

DECLARE
   x NUMBER:=&x;  --使用参数化的数值
   y NUMBER:=&y;
   z NUMBER;  
BEGIN
   z:=x+y;        --两个数相加       
   DBMS_OUTPUT.PUT_LINE('x+y='||z);     
   z:=x/y;        --两个数相除
   DBMS_OUTPUT.PUT_LINE('x/y='||z);
EXCEPTION         --异常处理语句块
   WHEN ZERO_DIVIDE THEN   --处理被0除异常
     DBMS_OUTPUT.PUT_LINE('被除数不能为0');   
END; 

自定义异常

DECLARE
   e_missingnull   EXCEPTION;                          --先声明一个异常
   PRAGMA EXCEPTION_INIT (e_missingnull, -1400);       --将该异常与-1400进行关联
BEGIN
   INSERT INTO emp(empno)VALUES (NULL);                --向emp表中不为空的列empno插入NULL值
   COMMIT;                                             --如果执行成功则使用COMMIT提交
EXCEPTION
   WHEN e_missingnull THEN                             --如果失败则捕捉到命名的异常
      DBMS_OUTPUT.put_line ('触发了ORA-1400错误!'||SQLERRM);
      ROLLBACK;
END;
异常处理

CREATE OR REPLACE PROCEDURE registeremployee (
   p_empno    IN   emp.empno%TYPE,                  --员工编号
   p_ename    IN   emp.ename%TYPE,                  --员工名称
   p_sal      IN   emp.sal%TYPE,                    --员工薪资
   p_deptno   IN   emp.deptno%TYPE                  --部门编号
)
AS
   v_empcount   NUMBER;                             
BEGIN
   IF p_empno IS NULL                               --如果员工编号为NULL则触发错误
   THEN
      raise_application_error (-20000, '员工编号不能为空');  --触发应用程序异常
   ELSE
      SELECT COUNT (*)
        INTO v_empcount
        FROM emp
       WHERE empno = p_empno;                       --判断员工编号是否存在
      IF v_empcount > 0                             --如果员工编号已存在
      THEN
         raise_application_error (-20001,
                                  '员工编号为:' || p_empno
                                  || '的员工已存在!'
                                 );                  --触发应用程序异常
      END IF;
   END IF;
   IF p_deptno IS NULL                              --如果部门编号为NULL
   THEN
      raise_application_error (-20002, '部门编号不能为空');  --触发应用程序异常
   END IF;
   INSERT INTO emp                                  --向emp表中插入员工记录
               (empno, ename, sal, deptno
               )
        VALUES (p_empno, p_ename, p_sal, p_deptno
               );
EXCEPTION
   WHEN OTHERS THEN                                 --捕捉应用程序异常
      raise_application_error (-20003,
                                  '插入数据时出现错误!异常编码:'
                               || SQLCODE
                               || ' 异常描述 '
                               || SQLERRM
                              );
END;



BEGIN
   RegisterEmployee(7369,'李明',2000,NULL);
END;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值