1 --[预定义异常]
2 declare
3
4 v_sal employees.salary%type;
5 begin
6 select salary into v_sal
7 from employees
8 where employee_id >100;
9
10 dbms_output.put_line(v_sal);
11
12 exception
13 when Too_many_rows then dbms_output.put_line('输出的行数太多了');
14 end;
15
16 --[非预定义异常]
17 declare
18
19 v_sal employees.salary%type;
20 --声明一个异常
21 delete_mgr_excep exception;
22 --把自定义的异常和oracle的错误关联起来
23 PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
24 begin
25 delete from employees
26 where employee_id = 100;
27
28 select salary into v_sal
29 from employees
30 where employee_id >100;
31
32 dbms_output.put_line(v_sal);
33
34 exception
35 when Too_many_rows then dbms_output.put_line('输出的行数太多了');
36 when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
37 end;
38
39 --[用户自定义异常]
40 declare
41
42 v_sal employees.salary%type;
43 --声明一个异常
44 delete_mgr_excep exception;
45 --把自定义的异常和oracle的错误关联起来
46 PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
47
48 --声明一个异常
49 too_high_sal exception;
50 begin
51
52 select salary into v_sal
53 from employees
54 where employee_id =100;
55
56 if v_sal > 1000 then
57 raise too_high_sal;
58 end if;
59
60 delete from employees
61 where employee_id = 100;
62
63 dbms_output.put_line(v_sal);
64
65 exception
66 when Too_many_rows then dbms_output.put_line('输出的行数太多了');
67 when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
68 --处理异常
69 when too_high_sal then dbms_output.put_line('工资过高了');
70 end;
71
72 --18. 异常的基本程序:
73 通过 select ... into ... 查询某人的工资, 若没有查询到, 则输出 "未找到数据"
74
75 declare
76 --定义一个变量
77 v_sal employees.salary%type;
78 begin
79 --使用 select ... into ... 为 v_sal 赋值
80 select salary into v_sal from employees where employee_id = 1000;
81 dbms_output.put_line('salary: ' || v_sal);
82 exception
83 when No_data_found then
84 dbms_output.put_line('未找到数据');
85 end;
86
87 或
88
89 declare
90 --定义一个变量
91 v_sal employees.salary%type;
92 begin
93 --使用 select ... into ... 为 v_sal 赋值
94 select salary into v_sal from employees;
95 dbms_output.put_line('salary: ' || v_sal);
96 exception
97 when No_data_found then
98 dbms_output.put_line('未找到数据!');
99 when Too_many_rows then
100 dbms_output.put_line('数据过多!');
101 end;
102
103 --19. 更新指定员工工资,如工资小于300,则加100;对NO_DATA_FOUND 异常, TOO_MANY_ROWS 进行处理.
104 declare
105 v_sal employees.salary%type;
106 begin
107 select salary into v_sal from employees where employee_id = 100;
108
109 if(v_sal < 300) then update employees set salary = salary + 100 where employee_id = 100;
110 else dbms_output.put_line('工资大于300');
111 end if;
112 exception
113 when no_data_found then dbms_output.put_line('未找到数据');
114 when too_many_rows then dbms_output.put_line('输出的数据行太多');
115 end;
116
117 --20. 处理非预定义的异常处理: "违反完整约束条件"
118
119 declare
120 --1. 定义异常
121 temp_exception exception;
122
123 --2. 将其定义好的异常情况,与标准的 ORACLE 错误联系起来,使用 EXCEPTION_INIT 语句
124 PRAGMA EXCEPTION_INIT(temp_exception, -2292);
125 begin
126 delete from employees where employee_id = 100;
127
128 exception
129 --3. 处理异常
130 when temp_exception then
131 dbms_output.put_line('违反完整性约束!');
132 end;
133
134 --21. 自定义异常: 更新指定员工工资,增加100;若该员工不存在则抛出用户自定义异常: no_result
135
136 declare
137 --自定义异常
138 no_result exception;
139 begin
140 update employees set salary = salary + 100 where employee_id = 1001;
141
142 --使用隐式游标, 抛出自定义异常
143 if sql%notfound then
144 raise no_result;
145 end if;
146
147 exception
148
149 --处理程序抛出的异常
150 when no_result then
151 dbms_output.put_line('更新失败');
152 end;