jlc*_*jlc 4 oracle triggers plsql
在Oracle中编写行级触发器时,我知道您可以使用OLD和NEW伪记录来引用触发触发器的行的旧状态和新状态.
我知道在INSERT触发器OLD中不包含任何数据,但我不确定这会如何影响该WHEN触发器的子句的评估.例如,如果我有以下触发器:
CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
BEGIN
:NEW.foo = 'some val';
END;
Run Code Online (Sandbox Code Playgroud)
并且我想修改此触发器以仅在foo以前为null时运行更新,但始终在插入上运行,我可以通过添加WHERE子句来满足更改的更新部分:
CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
WHEN (OLD.foo IS NULL)
BEGIN
:NEW.foo = 'some val';
END;
Run Code Online (Sandbox Code Playgroud)
这会在插入案例中引起问题吗?OLD.foo会评估什么INSERT?
我知道我可以在触发器体中拆分INSERT和UPDATE触发器或使用INSERTING/ UPDATING/ DELETING,但我宁愿不在启发这个问题的情况下.
Ada*_*ter 10
插入记录时,每个字段都OLD将是NULL,包括NOT NULL表中定义的字段.
例如,假设您的表具有一个名为的非可空列id:
CREATE TABLE some_table (
id NUMBER NOT NULL,
foo VARCHAR2(100)
)
Run Code Online (Sandbox Code Playgroud)
将记录插入此表时,OLD.id将会是NULL.但是,当在此表中更新记录时,OLD.id将不会NULL.因为您只想更改:NEW.foo记录是否正在更新,您只需要检查是否OLD.id具有非空值.
CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
WHEN (OLD.id IS NOT NULL AND OLD.foo IS NULL)
BEGIN
:NEW.foo = 'some val';
END;
Run Code Online (Sandbox Code Playgroud)