练习 1:捕获预定义异常
declare
v1 emp.sal%type;
begin
select sal into v1 from emp;
dbms_output.put_line('ok');
end;
/
declare
v1 emp.sal%type;
begin
select sal into v1 from emp;
exception
when TOO_MANY_ROWS then
dbms_output.put_line('ok');
end;
/
练习 2:捕获预定义异常
declare
v1 emp.sal%type;
begin
select sal into v1 from emp where empno=7777;
exception
when TOO_MANY_ROWS then
dbms_output.put_line('more person !');
-- when NO_DATA_FOUND then
-- dbms_output.put_line('no rows selected!');
when others then --other执行器
dbms_output.put_line(sqlcode||';'||sqlerrm);
end;
/
练习 3:捕获非预定义异常(捕获oracle错误代码)
declare
fk_error exception;--声明异常
pragma exception_init(fk_error,-2292);--使用编译指示器将异常名称和oracle的错误代码绑定
begin
delete dept; --oracle自动传播错误(fk_error)
dbms_output.put_line('ok');
exception
when TOO_MANY_ROWS then
dbms_output.put_line('more person ');
when NO_DATA_FOUND then
dbms_output.put_line('no person ');
when fk_error then
dbms_output.put_line('infringe forign key !');
end;
/
练习 4:捕获错误代码和错误描述,借助预定义函数sqlcode(ERROR代码),sqlerrm(ERROR文本)
begin
update emp set deptno=60;
dbms_output.put_line('ok');
exception
when TOO_MANY_ROWS then
dbms_output.put_line('more person !');
when NO_DATA_FOUND then
dbms_output.put_line('no person !');
when others then --other执行器
dbms_output.put_line(sqlcode||';'||sqlerrm);
end;
/
练习 5:捕获用户自定义的异常:
declare
my_error EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error, -20001);--编译指示,将命名的异常与ORACLE ERROR关联
BEGIN
raise_application_error(-20001,'工资不能被改动!');--将异常传送到环境
UPDATE e SET SAL=1000;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('未检索到数据!');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('SELECT返回多行数据!');
WHEN MY_ERROR THEN
DBMS_OUTPUT.PUT_LINE('E表工资不可以被修改!');
end;
/
练习 6:捕获用户自定义的异常
declare
my_error EXCEPTION;
PRAGMA EXCEPTION_INIT(my_error, -20001);
v_empno number(4):=&p_empno;
begin
IF TO_CHAR (SYSDATE, 'HH24') NOT BETWEEN '08' AND '14' OR TO_CHAR (SYSDATE, 'DY') IN ('星期六', '星期日') THEN
RAISE my_error;
else
insert into e(empno) values (v_empno);
dbms_output.put_line('insert 成功!');
END IF;
exception
when my_error then
dbms_output.put_line('该时间段不能向E表插入数据!');
end;
/
``
练习 7:打印 ORA-##### 错误编号和描述:
SPOOL D:\ORACLE_ERROR.TXT
SET SERVEROUTPUT ON
DECLARE
ERR_MSG VARCHAR2(4000);
ERR_CODE NUMBER(10);
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
FOR ERR_NUM IN 10230..10235
LOOP
ERR_CODE:=sqlcode;
ERR_MSG := SQLERRM(-ERR_NUM);
IF ERR_MSG NOT LIKE '%Message '||ERR_NUM||' not found%' then
dbms_output.put_line(ERR_MSG);
END IF;
END LOOP;
END;
/
SPOOL OFF;
declare
v_ename varchar2(10);
begin
select ename into v_ename from emp where empno=7839;
dbms_output.put_line(v_ename);
declare
v1 emp.sal%type;
begin
select sal into v1 from emp;
exception
when TOO_MANY_ROWS then
dbms_output.put_line(sqlcode||';'||sqlerrm);
end;
dbms_output.put_line('ok');
end;
/