Plsql 我一直收到一个变异表错误

Plsql 我一直收到一个变异表错误,plsql,Plsql,我想为每一行输出旧的和新的工资值,但不断得到一个变异表错误 这是我的触发代码: CREATE OR REPLACE TRIGGER print_salary_changes AFTER UPDATE OF salary ON emp2 FOR EACH ROW DECLARE v_employee_id NUMBER; v_old_salary NUMBER; v_new_salary NUMBER; v_difference NUMBER; BEGIN SELECT :OLD.em

我想为每一行输出旧的和新的工资值,但不断得到一个变异表错误

这是我的触发代码:

CREATE OR REPLACE TRIGGER print_salary_changes
AFTER UPDATE OF salary ON emp2
FOR EACH ROW 
DECLARE
v_employee_id  NUMBER;
v_old_salary  NUMBER;
v_new_salary  NUMBER;
v_difference  NUMBER;
BEGIN 
SELECT :OLD.employee_id, :OLD.salary, :NEW.salary INTO v_employee_id, v_old_salary,       v_new_salary FROM emp2;
v_difference := v_old_salary - v_new_salary;
         DBMS_OUTPUT.PUT_LINE ('employee_id: ' || v_employee_id);
         DBMS_OUTPUT.PUT_LINE ('old salary: ' || v_old_salary );
         DBMS_OUTPUT.PUT_LINE ('new salary: ' || v_new_salary);
         DBMS_OUTPUT.PUT_LINE ('DIFFERENCE: ' || v_difference);
END;

这是预期的正常行为,Oracle希望保护您:

  • 每个语句都是原子的
  • 每个语句都可以看到数据的一致视图 将您的触发器转换为程序,以解决您的操作逻辑。
    使用自主事务
    通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误

这是一种预期的正常行为,Oracle希望保护您:

  • 每个语句都是原子的
  • 每个语句都可以看到数据的一致视图 将您的触发器转换为程序,以解决您的操作逻辑。
    使用自主事务
    通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误

这是一种预期的正常行为,Oracle希望保护您:

  • 每个语句都是原子的
  • 每个语句都可以看到数据的一致视图 将您的触发器转换为程序,以解决您的操作逻辑。
    使用自主事务
    通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误

这是一种预期的正常行为,Oracle希望保护您:

  • 每个语句都是原子的
  • 每个语句都可以看到数据的一致视图 将您的触发器转换为程序,以解决您的操作逻辑。
    使用自主事务
    通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误

    • 您不需要执行select语句,您的触发器将已经具有旧值和新值

      试着这样做:

          CREATE OR REPLACE TRIGGER print_salary_changes
          AFTER UPDATE OF salary ON emp2
          FOR EACH ROW 
          BEGIN 
                   DBMS_OUTPUT.PUT_LINE ('employee_id: ' || :OLD.employee_id);
                   DBMS_OUTPUT.PUT_LINE ('old salary: ' || :OLD.salary );
                   DBMS_OUTPUT.PUT_LINE ('new salary: ' || :NEW.salary);
                   DBMS_OUTPUT.PUT_LINE ('DIFFERENCE: ' || (:OLD.salary -:NEW.salary ));
      END;
      

      您不需要执行select语句,触发器将已经具有旧值和新值

      试着这样做:

          CREATE OR REPLACE TRIGGER print_salary_changes
          AFTER UPDATE OF salary ON emp2
          FOR EACH ROW 
          BEGIN 
                   DBMS_OUTPUT.PUT_LINE ('employee_id: ' || :OLD.employee_id);
                   DBMS_OUTPUT.PUT_LINE ('old salary: ' || :OLD.salary );
                   DBMS_OUTPUT.PUT_LINE ('new salary: ' || :NEW.salary);
                   DBMS_OUTPUT.PUT_LINE ('DIFFERENCE: ' || (:OLD.salary -:NEW.salary ));
      END;
      

      您不需要执行select语句,触发器将已经具有旧值和新值

      试着这样做:

          CREATE OR REPLACE TRIGGER print_salary_changes
          AFTER UPDATE OF salary ON emp2
          FOR EACH ROW 
          BEGIN 
                   DBMS_OUTPUT.PUT_LINE ('employee_id: ' || :OLD.employee_id);
                   DBMS_OUTPUT.PUT_LINE ('old salary: ' || :OLD.salary );
                   DBMS_OUTPUT.PUT_LINE ('new salary: ' || :NEW.salary);
                   DBMS_OUTPUT.PUT_LINE ('DIFFERENCE: ' || (:OLD.salary -:NEW.salary ));
      END;
      

      您不需要执行select语句,触发器将已经具有旧值和新值

      试着这样做:

          CREATE OR REPLACE TRIGGER print_salary_changes
          AFTER UPDATE OF salary ON emp2
          FOR EACH ROW 
          BEGIN 
                   DBMS_OUTPUT.PUT_LINE ('employee_id: ' || :OLD.employee_id);
                   DBMS_OUTPUT.PUT_LINE ('old salary: ' || :OLD.salary );
                   DBMS_OUTPUT.PUT_LINE ('new salary: ' || :NEW.salary);
                   DBMS_OUTPUT.PUT_LINE ('DIFFERENCE: ' || (:OLD.salary -:NEW.salary ));
      END;
      

      应删除
      v_差值的计算,因为它将始终为空(没有为
      v_old_salary
      v_new_salary
      分配任何值。确实,更重要的是,不再需要任何变量。编辑了我的回答。
      v_difference
      的计算应删除,因为它将始终为空。)(没有为
      v_old_salary
      v_new_salary
      分配任何值。确实,更重要的是,不再需要任何变量。编辑了我的回答。
      v_difference
      的计算应删除,因为它将始终为空。)(没有为
      v_old_salary
      v_new_salary
      分配任何值。确实,更重要的是,不再需要任何变量。编辑了我的回答。
      v_difference
      的计算应删除,因为它将始终为空。)(没有为
      v_old_salary
      v_new_salary
      分配任何值。是的,更重要的是,不再需要任何变量。编辑了我的回答。