Oracle 在表中找不到给定记录时,如何处理游标中的异常
我正在使用循环游标更新Oracle 在表中找不到给定记录时,如何处理游标中的异常,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,我正在使用循环游标更新emp3(与emp表相同) DECLARE CURSOR incr_cur IS SELECT * FROM emp3 FOR UPDATE OF sal; v_job emp3.job%TYPE := '&ENTER_Job'; v_cnt INTEGER := 0; BEGIN FOR r_l IN incr_cur LOOP IF v_job IN (r_l.job) THEN UPDATE emp3 SET sal
emp3
(与emp表相同)
DECLARE
CURSOR incr_cur IS SELECT * FROM emp3 FOR UPDATE OF sal;
v_job emp3.job%TYPE := '&ENTER_Job';
v_cnt INTEGER := 0;
BEGIN
FOR r_l IN incr_cur LOOP
IF v_job IN (r_l.job) THEN
UPDATE emp3 SET sal = sal + 100 WHERE CURRENT OF incr_cur;
END IF;
END LOOP;
FOR r_l IN incr_cur LOOP
IF v_job IN (r_l.job) THEN
v_cnt := v_cnt + 1;
DBMS_OUTPUT.PUT_LINE('The Salary of ' || r_l.ename || ' is Incremented by 100 and the Updated Salary is: $' || r_l.sal);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('The Salary of '|| v_cnt ||' Employees are Updated');
END;
执行PL/SQL块时,它将请求作业,
我给经理
,然后担任经理
的员工的工资增加100。
emp3
表有5个工作类别职员
,经理
,分析师
,推销员
和总裁
。
然后如何显示消息作业未列出,因此无法进行更新。,如果用户输入的作业不在表中,例如DEVELOPER
。
我尝试过异常处理,但无法让它工作。这里有一个选项:检查是否存在这样的作业;如果没有,查询将返回
未找到任何数据
,您可以处理该数据并使用适当的消息引发异常。否则,继续执行更新
SQL> declare
2 l_job emp.job%type;
3 begin
4 begin
5 select job
6 into l_job
7 from emp
8 where job = '&ENTER_Job'
9 and rownum = 1;
10 exception
11 when no_data_found then
12 raise_application_error(-20000, 'That job does not exist');
13 end;
14
15 -- Job exists, so - go on with the update
16 end;
17 /
Enter value for enter_job: MANAGER
PL/SQL procedure successfully completed.
SQL> /
Enter value for enter_job: DEVELOPER
declare
*
ERROR at line 1:
ORA-20000: That job does not exist
ORA-06512: at line 12
SQL>
另外,我忘了提到:我更喜欢通过存储过程(接受作业名称作为参数)而不是匿名PL/SQL块来执行此类作业。不需要单独的步骤。只要尝试更新,如果没有行被更新,就说出来。如果希望它是一个异常,则使用raise\u application\u error
引发一个异常
假设这是一个学习练习,这就是为什么您不想只做一个普通的更新
,您可以这样做:
declare
k_job constant emp3.job%type := '&JOB';
cursor employees_cur is
select * from emp3
where job = k_job
for update of sal;
v_update_count integer := 0;
v_payroll_increase integer := 0;
begin
for r in employees_cur loop
update emp3 set sal = sal + 100 where current of employees_cur;
dbms_output.put_line('Salary for ' || r.ename || ' is incremented by $100 from $' || r.sal || ' to $' || (r.sal +100));
v_update_count := v_update_count + 1;
v_payroll_increase := v_payroll_increase + 100;
end loop;
if v_update_count = 0 then
dbms_output.put_line('No staff are currently employed as ' || k_job ||'. Payroll is unchanged.');
else
dbms_output.put_line('Updated salary of '|| v_update_count ||' employee' || case when v_update_count <> 1 then 's' end||'.');
dbms_output.put_line('Payroll increased by $'||v_payroll_increase||'.');
end if;
end;
/
Enter value for job: SALESMAN
Salary for ALLEN is incremented by $100 from $1600 to $1700
Salary for WARD is incremented by $100 from $1250 to $1350
Salary for MARTIN is incremented by $100 from $1250 to $1350
Salary for TURNER is incremented by $100 from $1500 to $1600
Updated salary of 4 employees.
Payroll increased by $400.
PL/SQL procedure successfully completed.
(在本例中,v_payroll\u increase
总是100倍v_update\u count
,但如果您想按部门等给出10%的加薪或不同的加薪,可能会更有用。)您为什么不使用带有where
子句的单个SQLupdate
语句来完成整个过程?
Enter value for job: ASTRONAUT
No staff are currently employed as ASTRONAUT. Payroll is unchanged.