【问题标题】:PLSQL Updating employee salary where department_id = 30 using cursorPLSQL使用游标更新员工工资,其中department_id = 30
【发布时间】:2021-08-24 03:52:27
【问题描述】:

我需要更新部门 30 的员工工资。部门 30 的所有员工的工资将增加 20%。我在执行代码时遇到了错误。

这是我的代码:

DECLARE
CURSOR cur_emp
IS
SELECT * FROM employees WHERE department_id = 30;
rec_emp cur_emp%rowtype;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO rec_emp;
IF rec_emp.department_id = 30 THEN
  UPDATE employees
  SET salary                = salary + (salary * 0.20)
  WHERE employee_id         = rec_emp.employee_id;
END IF;
EXIT
WHEN cur_emp%notfound;
 END LOOP;
CLOSE cur_emp;
END;
/

【问题讨论】:

  • 错误是什么?
  • ORA-04098:触发器 'HR.TRIG_CHK_SAL' 无效并且重新验证失败 ORA-06512:在第 11 行
  • 好的。所以有一个名为TRIG_CHK_SAL 的触发器未显示,可能是在employees 表上定义的,它有语法错误。该问题与您的匿名块无关。这是那个触发器的问题。
  • 那么我如何在不遇到 trig_chk 的情况下将员工工资从 dept=30 更新 20%?
  • 我用 ALTER TRIGGER trig_chk_sal DISABLE 禁用了 trig_chk_sal;

标签: oracle plsql oracle11g sql-update


【解决方案1】:

在注释掉导致当前问题的触发器代码部分或禁用它之后,您只能通过一个 DML 语句而不是代码块来处理任务,例如

SQL> UPDATE employees
        SET salary = ROUND(salary * 1.2,2)
      WHERE department_id = 30;
     /

SQL> COMMIT;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2020-01-18
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多