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希望保护您:
- 每个语句都是原子的
- 每个语句都可以看到数据的一致视图
将您的触发器转换为程序,以解决您的操作逻辑。
或
使用自主事务
通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误
- 每个语句都是原子的
- 每个语句都可以看到数据的一致视图
将您的触发器转换为程序,以解决您的操作逻辑。
或
使用自主事务
通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误
- 每个语句都是原子的
- 每个语句都可以看到数据的一致视图
将您的触发器转换为程序,以解决您的操作逻辑。
或
使用自主事务
通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误
- 每个语句都是原子的
- 每个语句都可以看到数据的一致视图
将您的触发器转换为程序,以解决您的操作逻辑。
或
使用自主事务
通过将触发器标记为自治事务,使其独立于调用过程的表,可以避免突变表错误
- 您不需要执行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
分配任何值。是的,更重要的是,不再需要任何变量。编辑了我的回答。