oracle - 当在表中找不到给定记录时如何处理游标异常

标签 oracle plsql oracle10g

我正在使用 Cursor For 循环更新 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 block 时,它会请求作业, 我给 MANAGER,那么作为 MANAGER 的员工的工资就会增加 100。 emp3 表有 5 个作业类别 CLERKMANAGERANALYSTSALESMAN总统。 那么,如果用户输入的 JOB 不在表中,例如 DEVELOPER,如何显示消息 The Job is not returned so update is not possible.。 我尝试过异常处理,但无法让它工作。

最佳答案

无需单独的步骤。只需尝试更新,如果没有更新任何行,请说明。如果您希望它成为异常,请使用 raise_application_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.

对于一个不存在的工作,你会得到这个:

Enter value for job: ASTRONAUT
No staff are currently employed as ASTRONAUT. Payroll is unchanged.

(在此示例中,v_payroll_increase 始终是 v_update_count 的 100 倍,但如果您想加薪 10% 或按部门等进行不同的加薪,这可能会更有用.)

关于oracle - 当在表中找不到给定记录时如何处理游标异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585297/

相关文章:

mysql - 如何从 ORACLE 中的函数中将 1,2,3.... 返回到单独的行中的 N?

sql查询结果格式

配置 WEBUTIL 后 Oracle Form 卡住

oracle - 如何从嵌套 Oracle 过程中检索值?

oracle - Oracle中触发更新,变异错误

sql - 当PL SQL匿名 block 完成时,为什么没有输出?

oracle - 如何在 PL-SQL 中创建参数化物化 View

sql - Oracle SQL 无效参数

sql - Oracle中以毫秒为单位的时间戳之间的差异

oracle - 如何调用正在运行的SQL脚本的文件名?