重构没有游标PL/SQL的代码

Xhe*_*nsB 2 oracle plsql

如何在不使用的情况下重构这些代码行CURSOR?我是PL/SQL的初学者.任何帮助,将不胜感激.谢谢

DECLARE
  CURSOR c_emps IS
    SELECT employee_id
      FROM bonus;

  v_region HR.REGIONS.region_name%TYPE;
  v_salary hr.employees.salary%TYPE;

BEGIN
  FOR r_emps IN c_emps LOOP
    SELECT reg.region_name, emp.salary
      INTO v_region, v_salary
      FROM hr.employees   emp,
           hr.departments dep,
           hr.Locations   loc,
           hr.countries   cot,
           hr.regions     reg
     WHERE emp.department_id = dep.department_id AND
           dep.location_id = loc.location_id AND
           loc.country_id = cot.country_id AND
           cot.region_id = reg.region_id AND
           employee_id = r_emps.employee_id;

    IF v_region = 'Europe' THEN
      UPDATE bonus
         SET bonus = bonus + (v_salary * .01)
       WHERE employee_id = r_emps.employee_id;
    ELSE
      UPDATE bonus
         SET bonus = v_salary * .01
       WHERE employee_id = r_emps.employee_id;
    END IF;  
  END LOOP;

  COMMIT;
END;
/
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 6

CURSOR c_emps IS
    SELECT employee_id
      FROM bonus;
Run Code Online (Sandbox Code Playgroud)

您不需要显式声明CURSOR.你可以在CURSOR FOR LOOP中做到这一点:

FOR r_emps IN (SELECT employee_id FROM bonus) 
LOOP
Run Code Online (Sandbox Code Playgroud)

如果PL/SQL不是必需的,那么您可以使用UPDATE语句中的CASE表达式在纯SQL中执行此操作.

就像是,

UPDATE bonus
SET bonus =
  CASE
    WHEN region = 'Europe'
    THEN bonus    + (v_salary * .01)
    ELSE v_salary * .01
...
and so on
Run Code Online (Sandbox Code Playgroud)

是的,您需要将整个PL/SQL代码重写为SQL更新语句.但是,它会更好更快.For循环是逐行处理,因此它是缓慢的.如果你可以在SQL中做同样的事情,请避免使用PL/SQL.