捕捉异常,并进行处理
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;