加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

在引入Oracle插入触发器的WHEN原因中,引用OLD的内容是什么?

发布时间:2021-04-02 23:01:41 所属栏目:站长百科 来源:网络整理
导读:在Oracle中编写行级触发器时,我知道您可以使用OLD和NEW伪记录来引用触发触发器的行的旧状态和新状态.我知道在INSERT触发器中OLD不包含任何数据,但我不确定这会如何影响该触发器的WHEN子句的评估.例如,如果我有以下触发器: CREATE OR REPLACE TRIGGER mung_r

在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;

并且我想修改此触发器以仅在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;

这会在插入案例中引起问题吗? OLD.foo将在INSERT中评估什么?

我知道我可以拆分INSERT和UPDATE触发器或在触发器体中使用INSERTING / UPDATING / DELETING,但我不想在启发这个问题的情况下.

解决方法

插入记录时,OLD的每个字段都将为NULL,包括表定义中标记为NOT NULL的字段.

例如,假设您的表具有名为id的非可空列:

CREATE TABLE some_table (
    id NUMBER NOT NULL,foo VARCHAR2(100)
)

将记录插入此表时,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;

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!