--异常处理
/*BEGIN
sequence_of_statements;
EXCEPTION
WHEN <exception_name> THEN
sequence_of_statements;
WHEN OTHERS THEN
sequence_of_statements;
END;
*/
常用的函数和过程:
SQLCODE: 返回错误代码,没有错误时返回0
SQLERRM:返回错误消息.
PRAGMA EXCEPTION_INIT():把用户自定义异常与相应的错误代码关联,使用用户自定义异常来捕获、处理错误
RAISE_APPLICATION_ERROR:可用于定义用户错误消息和在使用该过程的位置上暂 停程序的执行。
异常的分类:
--1)系统预定义异常
--根据部门编号查询员工信息
select * from emp where deptno=100;
declare
v_ename emp.ename%type;
v_deptno emp.deptno%type:=&no; --输入部门编号
begin
select ename into v_ename from emp where deptno=v_deptno;
DBMS_OUTPUT.PUT_LINE(v_ename);
--处理异常
exception
/* when NO_DATA_FOUND then
DBMS_OUTPUT.PUT_LINE('没有找到!'); */
when TOO_MANY_ROWS then
DBMS_OUTPUT.PUT_LINE('返回多条数据!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);
end;
select * from emp;
select * from dept;
--2)未预定义的异常 **
--实现修改编号为7788 的雇员所属的部门编号为99
declare
v_empno emp.empno%type:=&no; --编号为7788
--声明异常
ex exception; --异常情况> EXCEPTION;
--与标准的Oracle 错误联系起来,使用EXCEPTION_INIT 语句:
pragma EXCEPTION_init(ex,-2291); -- PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
begin
update emp set deptno=99 where empno=v_empno;
--处理异常
exception
when ex then
DBMS_OUTPUT.PUT_LINE('----->违反完整约束条件');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);
end;
--3)自定义异常
DECLARE
name varchar(10);
ex EXCEPTION; --(1)定义异常ex
BEGIN
SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';
DBMS_OUTPUT.PUT_LINE(name);
IF NAME<>'HR' THEN
RAISE ex; --(2)触发异常
END IF;
--(3)处理异常
EXCEPTION
WHEN ex THEN
DBMS_OUTPUT.PUT_LINE('10号部门不是HR'); --处理异常
END;
--查询编号为7788 的雇员的福利补助(comm 列)
select * from emp where empno=7788;
declare
v_comm emp.comm%type;
--1)声明异常
ex exception;
begin
select comm into v_comm from emp where empno=7369;
--判断
if v_comm is null then
raise ex; --2)抛出异常
end if;
dbms_output.put_line(v_comm);
--3)处理异常
exception
when ex then
dbms_output.put_line('7788 的雇员无福利补助!');
end;
/*BEGIN
sequence_of_statements;
EXCEPTION
WHEN <exception_name> THEN
sequence_of_statements;
WHEN OTHERS THEN
sequence_of_statements;
END;
*/
常用的函数和过程:
SQLCODE: 返回错误代码,没有错误时返回0
SQLERRM:返回错误消息.
PRAGMA EXCEPTION_INIT():把用户自定义异常与相应的错误代码关联,使用用户自定义异常来捕获、处理错误
RAISE_APPLICATION_ERROR:可用于定义用户错误消息和在使用该过程的位置上暂 停程序的执行。
异常的分类:
--1)系统预定义异常
--根据部门编号查询员工信息
select * from emp where deptno=100;
declare
v_ename emp.ename%type;
v_deptno emp.deptno%type:=&no; --输入部门编号
begin
select ename into v_ename from emp where deptno=v_deptno;
DBMS_OUTPUT.PUT_LINE(v_ename);
--处理异常
exception
/* when NO_DATA_FOUND then
DBMS_OUTPUT.PUT_LINE('没有找到!'); */
when TOO_MANY_ROWS then
DBMS_OUTPUT.PUT_LINE('返回多条数据!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);
end;
select * from emp;
select * from dept;
--2)未预定义的异常 **
--实现修改编号为7788 的雇员所属的部门编号为99
declare
v_empno emp.empno%type:=&no; --编号为7788
--声明异常
ex exception; --异常情况> EXCEPTION;
--与标准的Oracle 错误联系起来,使用EXCEPTION_INIT 语句:
pragma EXCEPTION_init(ex,-2291); -- PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
begin
update emp set deptno=99 where empno=v_empno;
--处理异常
exception
when ex then
DBMS_OUTPUT.PUT_LINE('----->违反完整约束条件');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('错误号:'||sqlcode||'-->消息:'||sqlerrm);
end;
--3)自定义异常
DECLARE
name varchar(10);
ex EXCEPTION; --(1)定义异常ex
BEGIN
SELECT DNAME INTO name FROM DEPT WHERE DEPTNO='10';
DBMS_OUTPUT.PUT_LINE(name);
IF NAME<>'HR' THEN
RAISE ex; --(2)触发异常
END IF;
--(3)处理异常
EXCEPTION
WHEN ex THEN
DBMS_OUTPUT.PUT_LINE('10号部门不是HR'); --处理异常
END;
--查询编号为7788 的雇员的福利补助(comm 列)
select * from emp where empno=7788;
declare
v_comm emp.comm%type;
--1)声明异常
ex exception;
begin
select comm into v_comm from emp where empno=7369;
--判断
if v_comm is null then
raise ex; --2)抛出异常
end if;
dbms_output.put_line(v_comm);
--3)处理异常
exception
when ex then
dbms_output.put_line('7788 的雇员无福利补助!');
end;