如何避免PL/SQL中的行级锁定
我有一个包含eid、SALLAY、newsal三列的表 我已经为所有员工插入了eid和工资。 现在,如果我更新任何员工的工资,我需要一个触发器,它直接将该员工的工资增加20%,并将其存储到newsal列中 我用了扳机:如何避免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:
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。如果答案正确,请接受答案。