Oracle PLSQL获取未退出

Oracle PLSQL获取未退出,oracle,plsql,Oracle,Plsql,让此员工表: 和plsql查询: DECLARE totaal_salaris INT := 0; CURSOR medewerker_cur IS SELECT naam, maandsal FROM MEDEWERKERS; medewerker_row medewerker_cur%rowtype; BEGIN OPEN medewerker_cur; LOOP FETCH medewerke

让此员工表:

和plsql查询:

DECLARE
    totaal_salaris    INT := 0;
    CURSOR medewerker_cur IS
      SELECT naam, maandsal
      FROM MEDEWERKERS;
      medewerker_row    medewerker_cur%rowtype;
BEGIN  
    OPEN medewerker_cur;
    LOOP
      FETCH medewerker_cur INTO medewerker_row;
      EXIT WHEN medewerker_cur%NOTFOUND OR totaal_salaris > 50000;
      UPDATE medewerkers
        SET maandsal = (medewerker_row.maandsal * 1.10)
        WHERE naam = medewerker_row.naam;
      totaal_salaris := totaal_salaris + medewerker_row.maandsal;
    END LOOP;
    dbms_output.put_line('Totaal uit te keren salaris: ' || totaal_salaris);
END;
/
其目的是将所有现有员工的工资(maandsal)提高10%,只要总工资<50000。但这根本行不通

我再次检查了运行脚本的witch,结果如下:

一些测试结果:

第一次跑步:

PL/SQL过程已成功完成。Totaal uit te keren salaris:55000

马恩萨尔变成了5500人

第二次

PL/SQL过程已成功完成。Totaal uit te keren salaris:55000

马恩萨尔变成了6050

第三次

PL/SQL过程已成功完成。科伦萨拉里斯托塔尔酒店:54450


maandsal改为6655,这应该是解决方案

DECLARE
    total_salaris    INT := 0;

    CURSOR employee_cur IS
      SELECT employee_id, first_name, salary
      FROM employees;

    employee_rec   employee_cur%rowtype;

BEGIN  
    OPEN employee_cur;
    LOOP
      FETCH employee_cur INTO employee_rec;
      total_salaris := total_salaris + (employee_rec.salary * 1.1);
      EXIT WHEN employee_cur%NOTFOUND OR total_salaris > 50000;

      UPDATE employees
        SET salary = (employee_rec.salary * 1.10)
        WHERE employee_id = employee_rec.employee_id;

    END LOOP;
    CLOSE employee_cur;

END;

每次跑步都会增加所有的薪水,还是只是其中的一部分?你们的跑步总收入应该是旧的还是新的?而且你的游标查询是无序的,所以哪些员工得到加薪是不确定的(现实世界有时会像这样;并查看
以获取更新信息
。对于我的不确定性,我深表歉意。我从所有员工加薪中得到的测试结果。已经尝试了很多。但是我想不出来。我觉得我的整个问题都是错的“总计”行不同意;如果没有退出循环,每次都会高出很多。好吧,你的意思是没有调用OR totaal_salaris>50000或totaal_salaris:=totaal_salaris+medewerker_row。maandsal不起作用?:不,它们看起来确实起作用。在第一次迭代11次、第二次迭代10次、第三次迭代9次之后,您将退出循环,因为它将提前到达50000次以上。(添加调试以验证这一点)。如果不是这样的话,你第一次会看到70000(14x5000),而不是55000。如果我创建数据并运行代码,我会看到11设置为5500,2设置为5000。经过三次迭代,我得到了10x6655、1x6050、1x5500和2x5000。如果您看到所有行都是6655,那么您没有运行发布的代码。