gpt4 book ai didi

oracle - 在没有游标的情况下重构代码 PL/SQL

转载 作者:行者123 更新时间:2023-12-01 22:30:58 29 4
gpt4 key购买 nike

如何在不使用 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;
/

最佳答案

CURSOR c_emps IS
SELECT employee_id
FROM bonus;

您不需要显式声明 CURSOR。您可以在 CURSOR FOR LOOP 本身中执行此操作:

FOR r_emps IN (SELECT employee_id FROM bonus) 
LOOP

如果 PL/SQL 不是必需的,那么您可以在 UPDATE< 中使用 CASE 表达式 在普通 SQL 中完成/strong>声明。

有点像,

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

是的,需要将整个PL/SQL代码重写成一条SQL更新语句。但是,它会更好更快。 For 循环是逐行 处理的,因此它是逐慢 的。如果可以在 SQL 中执行相同操作,请避免使用 PL/SQL。

关于oracle - 在没有游标的情况下重构代码 PL/SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29536969/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com