如何避免PL/SQL中的行级锁定

如何避免PL/SQL中的行级锁定,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我有一个包含eid、SALLAY、newsal三列的表 我已经为所有员工插入了eid和工资。 现在,如果我更新任何员工的工资,我需要一个触发器,它直接将该员工的工资增加20%,并将其存储到newsal列中 我用了扳机: create or replace trigger pp1 after update on empsal for each row BEGIN :new.newsal := :old.sal*1.2; END; 我不能按上面说的那样执行这个触发器 错误报告:ORA-04084:

我有一个包含eid、SALLAY、newsal三列的表

我已经为所有员工插入了eid和工资。 现在,如果我更新任何员工的工资,我需要一个触发器,它直接将该员工的工资增加20%,并将其存储到newsal列中

我用了扳机:

create or replace trigger pp1
after update on empsal
for each row
BEGIN
:new.newsal := :old.sal*1.2;
END;
我不能按上面说的那样执行这个触发器

错误报告:ORA-04084:无法更改此触发器的新值 类型 408400000-“无法更改此触发器类型的新值” *原因:新触发器变量只能在前一行中更改 插入或更新触发器。 *操作:更改触发器类型或删除变量引用

我的表格定义为:

> create table empsal(empno varchar2(8),sal number,newsal number,primary
> key(empno));

您可以在更新之前创建一个
触发器,如下所示

CREATE OR REPLACE TRIGGER test_trg
   BEFORE UPDATE
   ON empsal
   FOR EACH ROW
BEGIN
   :NEW.newsal := :new.sal * 1.2;
END;
例如

如果您使用的是Oracle11g,请利用虚拟列的概念,因此请尝试

CREATE TABLE empsal
(
   empno    VARCHAR2 (8),
   sal      NUMBER,
   newsal   GENERATED ALWAYS AS (sal * 1.2) VIRTUAL,
   PRIMARY KEY (empno)
);

您可以在更新之前创建一个
触发器,如下所示

CREATE OR REPLACE TRIGGER test_trg
   BEFORE UPDATE
   ON empsal
   FOR EACH ROW
BEGIN
   :NEW.newsal := :new.sal * 1.2;
END;
例如

如果您使用的是Oracle11g,请利用虚拟列的概念,因此请尝试

CREATE TABLE empsal
(
   empno    VARCHAR2 (8),
   sal      NUMBER,
   newsal   GENERATED ALWAYS AS (sal * 1.2) VIRTUAL,
   PRIMARY KEY (empno)
);

这是因为
之后的
-触发器无法写入
:new
-值。在
-触发器之前使用
。例如,授予(强调我的):

之前

指定BEFORE以使数据库在 正在执行触发事件。对于行触发器,将触发触发器 在更改每个受影响的行之前

触发器前触发器的限制取决于 以下限制:

  • 不能在视图或对象视图上指定BEFORE触发器
  • 您可以写入:新值,但不能写入:旧值
之后

指定AFTER以使数据库在之后触发触发器 正在执行触发事件。对于行触发器,将触发触发器 更改每个受影响的行之后

对AFTER触发器的限制AFTER触发器受 以下限制:

  • 不能在视图或对象视图上指定AFTER触发器
  • 不能写入:旧值或:新值。

这是因为
之后的
-触发器无法写入
:new
-值。在
-触发器之前使用
。例如,授予(强调我的):

之前

指定BEFORE以使数据库在 正在执行触发事件。对于行触发器,将触发触发器 在更改每个受影响的行之前

触发器前触发器的限制取决于 以下限制:

  • 不能在视图或对象视图上指定BEFORE触发器
  • 您可以写入:新值,但不能写入:旧值
之后

指定AFTER以使数据库在之后触发触发器 正在执行触发事件。对于行触发器,将触发触发器 更改每个受影响的行之后

对AFTER触发器的限制AFTER触发器受 以下限制:

  • 不能在视图或对象视图上指定AFTER触发器
  • 不能写入:旧值或:新值。

您不能将触发器更改为更新前的
,而不是更新后的
,正如错误消息所述吗?如果在更新后使用
,则可能无法更新该值?是否可以将触发器更改为更新前的
,而不是更新后的
,正如错误消息所述?如果在更新后使用
,则可能无法更新值?谢谢您的回答!但我想做的是,当我将sal从120更新到130时,我希望操作发生在130上,因此newsal=156@captainn3mo我已更新了触发代码,请尝试是否获得156。如果正确,请接受答案。谢谢你的回答!但我想做的是,当我将sal从120更新到130时,我希望操作发生在130上,因此newsal=156@captainn3mo我已更新了触发代码,请尝试是否获得156。如果答案正确,请接受答案。